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

时间:2019-07-06 05:51:45

标签: python pandas

想象一个这样的表:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type='text' id='firstNumber' placeholder='Enter a number'>
<input type='text' id='operation' placeholder='Enter an operation'>
<input type='text' id='secondNumer' placeholder='Enter another number'>
<br>
<button>Calculate</button>
<br>
<p>The result is <span id='result'></span></p>

对于每个名字,我想要一个累积平均值,如下所示:

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

因此,每当出现新名称时,累积平均值应“重新启动”。 名称列已排序,因此,每当出现新名称时,当前的累积平均值就会结束。

2 个答案:

答案 0 :(得分:2)

您需要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

答案 1 :(得分:2)

即使名称未通过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