【问题标题】:Python Pandas: Groupby Cumulative Sum, but avoiding sum where flag is 0Python Pandas:Groupby 累积总和,但避免标志为 0 的总和
【发布时间】:2020-08-20 05:53:56
【问题描述】:

已经有一些关于这个主题的问题(比如 Pandas:基于另一列的值的一列的累积总和)但是,它们都没有完全满足我的要求。 假设我有一个像这样的数据框:

id  flag
a   1
a   1
a   0
a   0
a   1
b   0
b   0
b   1
b   1
b   1
b   1
c   0
c   1
c   1
c   0
c   1

我想按 id 计算标志分组的累积总和,但要避免标志为 0 的总和,并且 cumsum 再次重置为 0。我尝试在np.where 中使用shift()groupby(id)['flag']cumsum() 进行总结,但没有运气。期望的输出应该是:

id  flag    cum_flag
a   1   1
a   1   2
a   0   0
a   0   0
a   1   1
b   0   0
b   0   0
b   1   1
b   1   2
b   1   3
b   1   4
c   0   0
c   1   1
c   1   2
c   0   0
c   1   1

生成数据帧的 DDL:

df = pd.DataFrame({'id': [a, a, a, a, a, b, b, b, b, b, b, c, c, c, c, c],
                 'flag': [1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1]})

感谢您的帮助!

【问题讨论】:

    标签: python pandas cumsum


    【解决方案1】:

    你可以用cumsum()来识别1的连续块,然后groupby

    df['cum_flag'] = df.groupby(['id',(df['flag']==0).cumsum()]).cumsum()
    

    输出:

       id  flag  cum_flag
    0   a     1         1
    1   a     1         2
    2   a     0         0
    3   a     0         0
    4   a     1         1
    5   b     0         0
    6   b     0         0
    7   b     1         1
    8   b     1         2
    9   b     1         3
    10  b     1         4
    11  c     0         0
    12  c     1         1
    13  c     1         2
    14  c     0         0
    15  c     1         1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2020-08-24
      • 2020-10-17
      相关资源
      最近更新 更多