Pandas 按带有标志条件的 cumsum 分组

Pandas group by cumsum with a flag condition

假设我有以下数据框

date flag user num
0 2019-01-01 1 a 10
1 2019-01-02 0 a 20
2 2019-01-03 1 b 30
3 2019-03-04 1 b 40

我想仅在 flag == 1 时创建按用户分组的 nums 的累加和 所以我会得到这个:

date flag user num cumsum
0 2019-01-01 1 a 10 10
1 2019-01-02 0 a 20 10
2 2019-01-03 1 b 30 30
3 2019-03-04 1 b 40 70

到目前为止,我能够通过标志进行 cumsum,而忽略了用户分组

df['cumsum'] = df[df['flag'] == 1 ]['num'].transform(pd.Series.cumsum)

或用户无视标志的 cumsum

df['cumsum'] = df.groupby('user')['num'].transform(pd.Series.cumsum)

我需要帮助让它们协同工作。

您可以将 num 乘以 flag 得到 num = 0,其中 flag = 0,按 user 分组,cumsum

df['cumsum'] = df['num'].mul(df['flag']).groupby(df['user']).cumsum()

输出:

>>> df
         date  flag user  num  cumsum
0  2019-01-01     1    a   10      10
1  2019-01-02     0    a   20      10
2  2019-01-03     1    b   30      30
3  2019-03-04     1    b   40      70

series.where标记num==0 其中flag为0则groupby+cumsum:

df['cumsum'] =  df['num'].where(df['flag'].eq(1),0).groupby(df["user"]).cumsum()

         date  flag user  num  cumsum
0  2019-01-01     1    a   10      10
1  2019-01-02     0    a   20      10
2  2019-01-03     1    b   30      30
3  2019-03-04     1    b   40      70