来自 groupby 平均值的 Pandas 新列

Posted

技术标签:

【中文标题】来自 groupby 平均值的 Pandas 新列【英文标题】:Pandas new column from groupby averages 【发布时间】:2022-01-24 05:45:35 【问题描述】:

我有一个数据框

>>> 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

并希望创建一个新列,该列是“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

但无法弄清楚如何将其转换为原始 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

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

【问题讨论】:

【参考方案1】:

你需要transform:

df['avg_result'] = df.groupby(['a', 'b'])['result'].transform('mean')

这会为您生成一个正确索引的 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

【讨论】:

以上是关于来自 groupby 平均值的 Pandas 新列的主要内容,如果未能解决你的问题,请参考以下文章

将 GroupBy 平均结果添加为 pandas 中的新列

Pandas实现groupby分组聚合后不同列数据统计

如何从 pandas groupby().sum() 的输出创建一个新列?

pandas groupby 应用于多个列以生成新列

pandas groupby 并创建新列

Pandas将groupby操作的结果保存为原始数据框中的新列[关闭]