Python Pandas:Groupby累积总和,但在标记为0的情况下避免总和

问题描述 投票:1回答:1

已经有关于此主题的一些问题(例如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且总和再次重置为0时求和。我尝试使用shift()中的groupby(id)['flag']cumsum()np.where进行总结,但没有运气。所需的输出应为:

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个回答
0
投票

您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.