Py学习  »  Python

python pandas:按其他列分组时创建累积平均值

Nicolas • 4 年前 • 1106 次点击  

想象一下这样一张桌子:

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

因此,每当出现新名称时,累积平均值就应该“重新启动”。 name列被排序,因此每当出现一个新名称时,当前的累积平均值就结束了。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46679
 
1106 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Alexander
Reply   •   1 楼
Alexander    4 年前

即使名字没有按 transforming 这个 expanding 函数..

>>> 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
anky_91
Reply   •   2 楼
anky_91    4 年前

你需要 expanding().mean() 使用Groupby:

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