web-dev-qa-db-fra.com

Pandas Groupe par Cumsum avec une condition de drapeau

En supposant que j'ai le cadre de données suivant

datedrapeauutilisateurnumérique
2019-01-011unedix
12019-01-02une20
22019-01-031b30
32019-03-041b40

Je souhaite créer une somme cumulée des nums regroupés par l'utilisateur uniquement si drapeau == 1 Donc, je vais obtenir ceci:

datedrapeauutilisateurnumériquecumsum
2019-01-011unedixdix
12019-01-02une20dix
22019-01-031b3030
32019-03-041b4070 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.

4
MakinetaJim

Vous pouvez multiplier num par flag pour faire num = 0flag = 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
2
user17242583