pandas中某列为0时如何重置每组累计和

How to reset cumulative sum per group when a certain column is 0 in pandas

我有以下数据框,我想在其中对特定列 (Value) 以及字段 Group 上的分组进行累加和,但将该累加和重置为 0当另一列 (Quantity) 中的值为 0 时。

Group Quantity Value Cumulative_sum
A 10 200 200
B 5 300 300
A 1 50 250
A 0 100 0
C 5 400 400
A 10 300 300
B 10 200 500
A 15 350 650

我试过像下面的代码一样使用块,但问题是它没有正确计算累计和:

blocks = df['Quantity'].eq(0)[::-1].cumsum()[::-1]

df['temp_field'] = (df.groupby(['Group', blocks])
   ['Value'].cumsum()
   .where(df['Quantity']!=0,df['Value'])
)

df['Cumulative_sum'] = np.where(df['Quantity'] == 0, 0, df['temp_field'])

有人可以帮忙吗?

  1. 对于给定的重置 condition,使用 groupby.cumsum 创建一个 Reset 石斑鱼,告诉我们何时 Quantity 在每个 Group:

    condition = df.Quantity.eq(0)
    df['Reset'] = condition.groupby(df.Group).cumsum()
    
    #   Group  Quantity  Value  Cumulative_sum  Reset
    # 0     A        10    200             200      0
    # 1     B         5    300             300      0
    # 2     A         1     50             250      0
    # 3     A         0    100               0      1
    # 4     C         5    400             400      0
    # 5     A        10    300             300      1
    # 6     B        10    200             500      0
    # 7     A        15    350             650      1
    
  2. mask 每当满足重置 conditionValue 列并使用另一个 groupby.cumsum GroupReset:

    df['Cumul'] = df.Value.mask(condition, 0).groupby([df.Group, df.Reset]).cumsum()
    
    #   Group  Quantity  Value  Cumulative_sum  Reset  Cumul
    # 0     A        10    200             200      0    200
    # 1     B         5    300             300      0    300
    # 2     A         1     50             250      0    250
    # 3     A         0    100               0      1      0
    # 4     C         5    400             400      0    400
    # 5     A        10    300             300      1    300
    # 6     B        10    200             500      0    500
    # 7     A        15    350             650      1    650