我有一个如下数据框:
col1 col2
0 1 True
1 3 True
2 3 True
3 1 False
4 2 True
5 3 True
6 2 False
7 2 True
我希望获得True
值的运行总和。每当我在False
中看到col2
值时,我需要将col1
的累积总和提升到该点。因此,DataFrame将如下所示:
col1 col2 col3
0 1 True 0
1 3 True 0
2 3 True 0
3 1 False 7
4 2 True 0
5 3 True 0
6 2 False 5
7 2 True 0
我该怎么做?
答案 0 :(得分:3)
您可以在col2
上创建一个包含cumsum的组变量,然后计算每组的总和:
df.loc[~df.col2, 'col3'] = (df.col1 * df.col2).groupby(by = (~df.col2).cumsum()).cumsum().shift()
df.fillna(0)
答案 1 :(得分:3)
您可以使用更通用的解决方案,该解决方案适用于多个连续False
- 然后累积总和值不会更改:
a = df.groupby((df.col2 != df.col2.shift()).cumsum())['col1'].transform('sum')
df['d'] = a.where(df.col2).ffill().mask(df.col2).fillna(0).astype(int)
print (df)
col1 col2 d
0 1 True 0
1 3 True 0
2 3 True 0
3 1 False 7
4 2 True 0
5 3 True 0
6 2 False 5
7 2 True 0
#added 2 last rows with False in col2
print (df)
col1 col2
0 1 True
1 3 True
2 3 True
3 1 False
4 2 True
5 3 True
6 2 False
7 2 True
8 4 False
9 4 False
a = df.groupby((df.col2 != df.col2.shift()).cumsum())['col1'].transform('sum')
df['d'] = a.where(df.col2).ffill().mask(df.col2).fillna(0).astype(int)
print (df)
col1 col2 d
0 1 True 0
1 3 True 0
2 3 True 0
3 1 False 7
4 2 True 0
5 3 True 0
6 2 False 5
7 2 True 0
8 4 False 2
9 4 False 2