根据另一列重置累计总和

reset cumulative sum based on another column

关于条件累加和(, Reset Cumulative sum base on condition Pandas, )的问答很多。但我无法解决我面临的问题。以下是我拥有的部分数据,要求是保持 'type' 和相应累积总和的变化计数。

  type sale
    y   10   
    y   20   
    y    5   
    n   30   
    n   20   
    n    5   
    y   10   
    y   40   
    y   15   

我的要求是获得类型变化和累计销售额的连续计数,如下所示。

   type sale tp_cum cum_sale
    y   10    1      10
    y   20    1      30
    y    5    1      35
    n   30    2      30
    n   20    2      50 
    n    5    2      55
    y   10    3      10
    y   40    3      50
    y   15    3      65

我尝试对下面的代码进行各种修改,但并不完全符合要求。请帮忙。

sales['cum_sale'] = stock.groupby('type')['sale'].cumsum()

数据框:

df = pd.DataFrame([["y",10 ], 
["y",20  ],
["y",5  ],
["n",30   ],
["n",20   ],
["n",5 ],
["y",10  ], 
["y",40  ],
["y",15 ]],columns = ["type","sale"])

这是一个选项,您首先创建 tp_cum 列,然后 cumsum()

import pandas as pd
import numpy as np

df = pd.DataFrame([["y",10 ], 
["y",20  ],
["y",5  ],
["n",30   ],
["n",20   ],
["n",5 ],
["y",10  ], 
["y",40  ],
["y",15 ]],columns = ["type","sale"])

df["type2"] = np.cumsum((df["type"] != df["type"].shift(1)))
df["cum_sale"] = df[["sale","type2"]].groupby("type2").cumsum()
df

输出:

    type    sale    type2  cum_sale
0   y       10      1      10
1   y       20      1      30
2   y       5       1      35
3   n       30      2      30
4   n       20      2      50
5   n       5       2      55
6   y       10      3      10
7   y       40      3      50
8   y       15      3      65