En supposant que j'ai le cadre de données suivant
date | drapeau | utilisateur | numérique | |
---|---|---|---|---|
2019-01-01 | 1 | une | dix | |
1 | 2019-01-02 | une | 20 | |
2 | 2019-01-03 | 1 | b | 30 |
3 | 2019-03-04 | 1 | b | 40 |
Je souhaite créer une somme cumulée des nums regroupés par l'utilisateur uniquement si drapeau == 1 Donc, je vais obtenir ceci:
date | drapeau | utilisateur | numérique | cumsum | |
---|---|---|---|---|---|
2019-01-01 | 1 | une | dix | dix | |
1 | 2019-01-02 | une | 20 | dix | |
2 | 2019-01-03 | 1 | b | 30 | 30 |
3 | 2019-03-04 | 1 | b | 40 | 70 ans |
Jusqu'à présent, j'ai pu cumsum par drapeau, sans tenir compte du groupe par l'utilisateur
df['cumsum'] = df[df['flag'] == 1 ]['num'].transform(pd.Series.cumsum)
ou cumsum par l'utilisateur ignorant le drapeau
df['cumsum'] = df.groupby('user')['num'].transform(pd.Series.cumsum)
J'ai besoin d'aide pour les faire travailler ensemble.
Vous pouvez multiplier num
par flag
pour faire num = 0
où flag = 0
, groupe par user
, et cumsum
:
df['cumsum'] = df['num'].mul(df['flag']).groupby(df['user']).cumsum()
Sortir:
>>> 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