如何在pandas中使用groupby输出填充fillna?

8

我有一个数据框,有4列(A、B、C、D),D中有一些NaN值。我想用具有相同A、B、C值的D的平均值来填充NaN值。

例如,如果A、B、C、D的值分别为x、y、z和NaN,则我希望将NaN值替换为A、B、C的值分别为x、y、z的行的D的平均值。

3个回答

19

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

嗨@zero,我正在尝试使用您的行星数据集方法,但它没有填充所有值。不确定原因:https://dev59.com/5XkPtIcB2Jgan1znfgCF#73450241 - Roy

9
我认为你需要:

我认为你需要:

df.D = df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean()))

示例:

df = pd.DataFrame({'A':[1,1,1,3],
                   'B':[1,1,1,3],
                   'C':[1,1,1,3],
                   'D':[1,np.nan,3,5]})

print (df)
   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

df.D = df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean()))
print (df)
   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

2

关于此问题的进一步信息,请参考以下链接: Pandas Dataframe:用行平均值替换NaN

链接中提到的另一种建议方法是在转置后使用简单的fillna: df.T.fillna(df.mean(axis=1)).T


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接