根据Pandas中的另一列运行总和

时间:2017-01-10 17:16:35

标签: python pandas

我有一个如下数据框:

   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

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以在col2上创建一个包含cumsum的组变量,然后计算每组的总和:

df.loc[~df.col2, 'col3'] = (df.col1 * df.col2).groupby(by = (~df.col2).cumsum()).cumsum().shift()
df.fillna(0)

enter image description here

答案 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