来自 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 新列的主要内容,如果未能解决你的问题,请参考以下文章