Cela devrait le faire, besoin de groupby()deux fois:
df.groupby(['name', 'day']).sum() \
.groupby(level=0).cumsum().reset_index()
Explication:
print(df)
name day no
0 Jack Monday 10
1 Jack Tuesday 20
2 Jack Tuesday 10
3 Jack Wednesday 50
4 Jill Monday 40
5 Jill Wednesday 110
print( df.groupby(['name', 'day']).sum() )
no
name day
Jack Monday 10
Tuesday 30
Wednesday 50
Jill Monday 40
Wednesday 110
print( df.groupby(['name', 'day']).sum() \
.groupby(level=0).cumsum() )
no
name day
Jack Monday 10
Tuesday 40
Wednesday 90
Jill Monday 40
Wednesday 150
Le dataframe résultant de la première somme est indexé par 'name'et par 'day'. Vous pouvez le voir en imprimant
df.groupby(['name', 'day']).sum().index
Lors du calcul de la somme cumulée, vous voulez le faire par 'name', correspondant au premier index (niveau 0).
Enfin, utilisez reset_indexpour répéter les noms.
df.groupby(['name', 'day']).sum().groupby(level=0).cumsum().reset_index()
name day no
0 Jack Monday 10
1 Jack Tuesday 40
2 Jack Wednesday 90
3 Jill Monday 40
4 Jill Wednesday 150