Pandas 分组后填充熊猫中的NaN值

Pandas 分组后填充熊猫中的NaN值,pandas,dataframe,group-by,Pandas,Dataframe,Group By,这个问题与通常填充NaN值略有不同 假设我有一个数据帧,其中我按某个类别分组。现在,我想通过使用该组的平均值来填充一列的NaN值,但是来自不同的列。 让我举一个例子: a = pd.DataFrame({ 'Occupation': ['driver', 'driver', 'mechanic', 'teacher', 'mechanic', 'teacher', 'unemployed', 'driver', 'mechanic', 'teacher'], 'salary': [100

这个问题与通常填充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值,如下所示: 工资-各组的平均值(差异)


如何使用pandas实现这一点?

您可以使用所需的值创建新系列,
groupby.transform
并使用更新目标列

假设您想按职业分组

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

它给出了一个错误:TypeError:update()得到了一个意外的关键字参数“overwrite”。我已经更新了df创建代码,您现在可以对其进行测试。它正在估算支出的平均值,而不是差异。没问题,您可以动态创建该
mean_diff
,而不是创建新列,所以你不必在看到我在试图用那个特定点的工资来填补它之后就放弃——这对那个群体来说意味着不同。我可能在帖子中的措辞不正确,让我来编辑一下。