Python Pandas:按其他列分组创建累积平均值

5
想象一张像这样的表格:
name | value 
-----|------
Jack | 0    
Jack | 1
Jack | 0.5
Jack | 1
Jill | 0
Jill | 2

我希望获得每个名称的累积平均值,就像这样:

name | value | cumAverage
-----|-------|-----------
Jack | 0     | 0
Jack | 1     | 0.5
Jack | 0.5   | 0.5
Jack | 1     | 0.625
Jill | 0     | 0
Jill | 2     | 1

无论何时出现一个新的名称,累积平均值都应该“重新开始”。 名称列是已排序的,所以每当出现一个新名称时,当前累积平均值就会结束。

你应该包含代码,展示你尝试了什么。另外,你的一些平均值不正确(第四和第五个)? - Akaisteph7
抱歉,我已经纠正了代码中的错误。关于pandas,它大多数情况下可以用一行代码解决问题。我知道有cumsum()函数来处理类似的问题,但是它计算的是总和而不是平均值(我可以将其除以另一个帮助列,该列仅计算当前名称出现的次数),但是我不知道如何可能在出现新名称时“重置”累积平均值。 - Nicolas
2个回答

9
你需要使用groupby和expanding().mean()
df.groupby('name')['value'].expanding().mean().reset_index(0)

对于未排序的 df,以下方法可行:
df.groupby('name')['value'].expanding().mean().reset_index(0).sort_index()

   name  value
0  Jack  0.000
1  Jack  0.500
2  Jack  0.500
3  Jack  0.625
4  Jill  0.000
5  Jill  1.000

4
即使名称未按照转换函数 transformexpanding 函数进行排序,此方法仍可奏效。
>>> df.assign(cumAverage=df.groupby('name', sort=False)['value'].transform(lambda x: x.expanding().mean()))
   name  value  cumAverage
0  Jack    0.0       0.000
1  Jack    1.0       0.500
2  Jack    0.5       0.500
3  Jack    1.0       0.625
4  Jill    0.0       0.000
5  Jill    2.0       1.000

# Unsorted dataframe.
df = pd.DataFrame({"name": ['Jack'] * 3 + ['Jill'] * 2 + ['Jack'], "value": [0, 1, .5, 0, 2, 1]})
>>> df.assign(cumAverage=df.groupby('name', sort=False)['value'].transform(lambda x: x.expanding().mean()))
   name  value  cumAverage
0  Jack    0.0       0.000
1  Jack    1.0       0.500
2  Jack    0.5       0.500
3  Jill    0.0       0.000
4  Jill    2.0       1.000
5  Jack    1.0       0.625

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接