每当列中遇到0时,Python都会使用上一个值求和
我有一个pandas列,当它中遇到0时,我想使用上一个值对它进行求和。通过这个例子会更清楚-每当列中遇到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
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)
以保留条纹结束元素,同时用0填充其他元素.where()
- 其次,执行
,使用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