熊猫来自groupby平均值的新栏目

rur*_*urp 4 python dataframe pandas

我有一个DataFrame

>>> df = pd.DataFrame({'a':[1,1,1,2,2,2],
...                    'b':[10,20,20,10,20,20],
...                    'result':[100,200,300,400,500,600]})
... 
>>> df
   a   b  result
0  1  10     100
1  1  20     200
2  1  20     300
3  2  10     400
4  2  20     500
5  2  20     600
Run Code Online (Sandbox Code Playgroud)

并希望创建一个新列,作为“ a”和“ b”对应值的平均结果。我可以通过groupby获得这些值:

>>> df.groupby(['a','b'])['result'].mean()
a  b 
1  10    100
   20    250
2  10    400
   20    550
Name: result, dtype: int64
Run Code Online (Sandbox Code Playgroud)

但无法弄清楚如何将其转换为原始DataFrame中的新列。最终结果应如下所示:

>>> df
   a   b  result  avg_result
0  1  10     100         100
1  1  20     200         250
2  1  20     300         250
3  2  10     400         400
4  2  20     500         550
5  2  20     600         550
Run Code Online (Sandbox Code Playgroud)

我可以通过遍历“ a”和“ b”的组合来做到这一点,但是对于更大的数据集,这将变得非常缓慢且笨拙。可能有一种更简单,更快捷的方法。

Ale*_*ley 8

您需要transform

df['avg_result'] = df.groupby(['a','b'])['result'].transform('mean')
Run Code Online (Sandbox Code Playgroud)

这将为您生成groupby值的正确索引列:

   a   b  result  avg_result
0  1  10     100         100
1  1  20     200         250
2  1  20     300         250
3  2  10     400         400
4  2  20     500         550
5  2  20     600         550
Run Code Online (Sandbox Code Playgroud)