pandas - 分组后在熊猫中填充NaN值
问题描述
这个问题与通常填充 NaN 值略有不同。
假设我有一个数据框,其中我按某个类别分组。现在我想通过使用该组的平均值但来自不同的列来填充列的 NaN 值。让我举个例子:
a = pd.DataFrame({
'Occupation': ['driver', 'driver', 'mechanic', 'teacher', 'mechanic', 'teacher',
'unemployed', 'driver', 'mechanic', 'teacher'],
'salary': [100, 150, 70, 300, 90, 250, 10, 90, 110, 350],
'expenditure': [20, 40, 10, 100, np.nan, 80, 0, np.nan, 40, 120]})
a['diff'] = a.salary - a.expenditure
Occupation salary expenditure diff
0 driver 100 20.0 80.0
1 driver 150 40.0 110.0
2 mechanic 70 10.0 60.0
3 teacher 300 100.0 200.0
4 mechanic 90 NaN NaN
5 teacher 250 80.0 170.0
6 unemployed 10 0.0 10.0
7 driver 90 NaN NaN
8 mechanic 110 40.0 70.0
9 teacher 350 120.0 230.0
因此,在上述情况下,我想将支出中的 NaN 值填写为:每个组的薪水 - 平均值(差异)。
我如何使用熊猫来做到这一点?
解决方案
您可以创建具有所需值的新系列,groupby.transform
并用于更新目标列。
假设你想分组Occupation
a['mean_diff'] = a.groupby('Occupation')['diff'].transform('mean')
a.expenditure.mask(
a.expenditure.isna(),
a.salary - a.mean_diff,
inplace=True
)
输出
Occupation salary expenditure diff mean_diff
0 driver 100 20.0 80.0 95.0
1 driver 150 40.0 110.0 95.0
2 mechanic 70 10.0 60.0 65.0
3 teacher 300 100.0 200.0 200.0
4 mechanic 90 25.0 NaN 65.0
5 teacher 250 80.0 170.0 200.0
6 unemployed 10 0.0 10.0 10.0
7 driver 90 -5.0 NaN 95.0
8 mechanic 110 40.0 70.0 65.0
9 teacher 350 120.0 230.0 200.0
推荐阅读
- powerbi - 使用Measures模拟计算列时如何使钻取正常工作
- android - Action(Click) 正在使用 NavigationView(Navigation Drawer) 实现布局 xml 文件
- sql - 如何仅从所有间隔都有值的地方进行选择?
- java - Swing 的 KeyStroke.getKeyStroke() 返回 UNKNOWN
- excel - 如果满足条件,如何将范围从多张纸复制到一张纸(另一个范围下的一个范围)?
- android - FirebaseMessaging:找不到启动应用程序的活动
- php - 身份不明的 PHP 和 PDO 执行时间长
- python - 仅当传递的参数是字符串时,如何实例化类?
- api - (Quickbooks Online) 通过 API 触发字段自动填充
- javascript - 管道,带有动态参数的 ramda