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
假设我有以下数据框
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