每当列中遇到0时,Python都会使用上一个值求和

每当列中遇到0时,Python都会使用上一个值求和,python,pandas,Python,Pandas,我有一个pandas列,当它中遇到0时,我想使用上一个值对它进行求和。通过这个例子会更清楚- ds = pd.DataFrame([0,1,2,3,4,50,0,1,3,5,55,0,5], columns = ['a']) print(ds) a 0 0 1 1 2 2 3 3 4 4 5 50 6 0 7 1 8 3 9 5 10 55 11 0 12 5 输出应该是- a 0 0 1 1 2 2 3 3 4

我有一个pandas列,当它中遇到0时,我想使用上一个值对它进行求和。通过这个例子会更清楚-

ds = pd.DataFrame([0,1,2,3,4,50,0,1,3,5,55,0,5], columns = ['a'])

print(ds)

    a
0   0
1   1
2   2
3   3
4   4
5   50
6   0
7   1
8   3
9   5
10  55
11  0
12  5
输出应该是-

    a
0   0
1   1
2   2
3   3
4   4
5   50
6   50
7   51
8   53
9   55
10  105
11  105
12  110

尝试使用
shift
然后使用
where
将所有非0屏蔽为
NaN
,然后执行
cumsum
,因为您需要再次添加前一个填充值

df.a = df.a.add(df.a.shift().where(df.a.eq(0)).cumsum().ffill(),fill_value=0)
Out[132]: 
0       0.0
1       1.0
2       2.0
3       3.0
4       4.0
5      50.0
6      50.0
7      51.0
8      53.0
9      55.0
10    105.0
11    105.0
12    110.0
Name: a, dtype: float64

可以利用
.diff(-1)
直接获得条纹结束位置(50和55):

  • 首先,将
    .diff(-1)
    放入
    .where()
    以保留条纹结束元素,同时用0填充其他元素
  • 其次,执行
    cumsum()
    ,使用
    fill_value=0将结果向前移动1,并将其添加到原始数据中
代码:

结果:

print(ds)
      a
0     0
1     1
2     2
3     3
4     4
5    50
6    50
7    51
8    53
9    55
10  105
11  105
12  110

不错,另一种方法可以是使用
mask
-
ds.add(ds.mask(ds['a'].shift(-1.ne(0)).shift(1.cumsum().ffill().fillna(0))
print(ds)
      a
0     0
1     1
2     2
3     3
4     4
5    50
6    50
7    51
8    53
9    55
10  105
11  105
12  110