Esto debería hacerlo, necesita groupby()dos veces:
df.groupby(['name', 'day']).sum() \
.groupby(level=0).cumsum().reset_index()
Explicación:
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
El marco de datos resultante de la primera suma se indexa por 'name'y por 'day'. Puedes verlo imprimiendo
df.groupby(['name', 'day']).sum().index
Al calcular la suma acumulada, desea hacerlo por 'name', correspondiente al primer índice (nivel 0).
Por último, utilice reset_indexpara que se repitan los nombres.
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