带有标志条件的 Pandas 分组累加求和

6
假设我有以下数据框: ```
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
``` 我想创建一个按用户分组的 nums 的累加和,只有当 flag == 1 时才进行累加。结果应该是这样的: ```
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
``` 到目前为止,我已经按 flag 进行了累加,但是没有按用户进行分组。
df['cumsum'] = df[df['flag'] == 1 ]['num'].transform(pd.Series.cumsum)

或者按用户累加忽略标志

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

我需要帮助使它们一起工作。
2个回答

4

您可以使用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

1

使用 series.where 方法将标记为 0 的 num 替换为 flag,然后进行 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接