如何用大pandas的groupby输出来填充?
发布于 2021-01-29 18:05:28
我有一个具有4列(A,B,C,D)的数据框。D有一些NaN条目。我想用具有相同A,B,C值的D的平均值填充NaN值。
例如,如果A,B,C,D的值分别为x,y,z和Nan,那么我想将NaN值替换为A,B,C值的行的D平均值分别是x,y,z。
关注者
0
被浏览
42
1 个回答
-
df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean'))
会比apply
In [2400]: df Out[2400]: A B C D 0 1 1 1 1.0 1 1 1 1 NaN 2 1 1 1 3.0 3 3 3 3 5.0 In [2401]: df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) Out[2401]: 0 1.0 1 2.0 2 3.0 3 5.0 Name: D, dtype: float64 In [2402]: df['D'] = df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) In [2403]: df Out[2403]: A B C D 0 1 1 1 1.0 1 1 1 1 2.0 2 1 1 1 3.0 3 3 3 3 5.0
细节
In [2396]: df.shape Out[2396]: (10000, 4) In [2398]: %timeit df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) 100 loops, best of 3: 3.44 ms per loop In [2397]: %timeit df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean())) 100 loops, best of 3: 5.34 ms per loop