pandas:将空值替换为按组的平均值



我正试图用另一列中根据组的平均值替换一列中的空值。我试过这个代码,空值被替换了,但没有正确。为什么呢我该如何更正?

前两个空值应该用3代替,因为它们属于平均值为3的组"a"。下面的零值应该是4,因为它位于具有4、2、5平均值3的组B中。

列"z"应具有以下值:3 3 5 3 1 2 4 6 9 10 5

xx=float('nan')
data=[['A', 1, xx ],
['B', 5,5],
['C', 4,6]
,['A', 6,xx],
['B',9,xx],
['C', 7,9]
,['A', 2,3],
['B', 5,1],
['C',2,10]
,['B', 8,2],
['B', 5,4],
['C', 8,5 ]]
dff = pd.DataFrame(data, columns=['x','y','z'])
dff = dff.sort_values(by =['x'], ascending=True)
dff.reset_index(drop=True, inplace= True)
print(dff)
dff['z'] = df.groupby(['x'])['z'].transform(lambda x: x.fillna(x.mean()))
print(dff)

可以用.fillna替换缺失值,用groupby(...).mean(...)替换组平均值。

一个有用的技巧是使用groupby.transform('mean'),它返回原始形状的序列或数据帧:

>>> dff.groupby('x')['z'].mean()
x
A    3.0
B    3.0
C    7.5
Name: z, dtype: float64
>>> dff.groupby('x')['z'].transform('mean')
0     3.0
1     3.0
2     3.0
3     3.0
4     3.0
5     3.0
6     3.0
7     3.0
8     7.5
9     7.5
10    7.5
11    7.5
Name: z, dtype: float64

请注意,组B的平均值是3,而不是您预期的4

所以它就变成了:

>>> dff['z'].fillna(dff.groupby('x')['z'].transform('mean'))
0      3.0
1      3.0
2      3.0
3      5.0
4      3.0
5      1.0
6      2.0
7      4.0
8      6.0
9      9.0
10    10.0
11     5.0
Name: z, dtype: float64

相关内容

  • 没有找到相关文章

最新更新