【问题标题】:Pandas group by cumsum with a flag conditionPandas 按带有标志条件的 cumsum 分组
【发布时间】:2022-01-18 22:17:07
【问题描述】:

假设我有以下数据框

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)

我需要帮助让他们一起工作。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby cumsum


    【解决方案1】:

    您可以将num 乘以flag 得到num = 0 其中flag = 0usercumsum 分组:

    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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 2016-04-04
        • 1970-01-01
        相关资源
        最近更新 更多