python - pandas:按组用平均值替换空值
问题描述
我正在尝试根据另一列中的组用平均值替换列中的空值。我试过这段代码,空值被替换但不正确。怎么会这样?我应该如何纠正这个?
前两个空值应替换为 3,因为它们属于平均为 3 的组“A”。以下空值应为 4,因为位于具有 4、2、1、5 平均 3 的组 B 中。
列“z”应具有以下值:3 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
推荐阅读
- node.js - 一个 GET 请求,但被 express、node.js 中的多个 .get 函数捕获
- sql - 根据条件设置组中一条记录的值 - SQL Server
- python - SMTPAuthenticationError:(535,b'5.7.8 Django 生产中不接受用户名和密码?
- ios - +[FIRAnalytics setAnalyticsCollectionEnabled:]:发送到类的无法识别的选择器
- node.js - 全栈 javascript 应用程序共享接口
- java - 如何理解一个网站正在使用 gzip 压缩?
- opencv - 为什么我的视差图的边缘这么肥?
- sql - 如何在sql中获取日期范围内的数据
- java - 复制到剪贴板的 JavaFX 字符串以空字符 '\u0000' 开头被截断
- laravel - 控制器功能使用登录用户运行两次?