已经有关于此主题的一些问题(例如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]})
感谢您的帮助!
您可以使用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