num=[1,2,3,4,5,6,7,8,-1,2,3,4,5,6,]
df=pd.DataFrame(num)
df['i_want_that']=[1,2,3,4,5,6,7,8,0,0,0,0,0,0]
print(df)
0 i_want_that
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 6 6
6 7 7
7 8 8
8 -1 -1
9 -1 0
10 -1 0
11 -1 0
12 -1 0
13 -1 0
如果'0'值为-1,则所有剩余行将在某个时间为零 -1可以进入任何行
答案 0 :(得分:2)
您可以使用idxmax
作为第一个-1
的索引,然后使用loc
将此索引中的所有值覆盖到列0
的末尾:
print((df[0] == -1).idxmax())
8
df.loc[(df[0] == -1).idxmax():, 0] = 0
print (df)
0 i_want_that
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 6 6
6 7 7
7 8 8
8 0 0
9 0 0
10 0 0
11 0 0
12 0 0
13 0 0
另一个解决方案是按cumsum
获取布尔值掩码,然后按mask
覆盖值:
mask = (df[0] == -1).cumsum() != 0
print (mask)
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 True
9 True
10 True
11 True
12 True
13 True
Name: 0, dtype: bool
df['new'] = df[0].mask(mask, 0)
print (df)
0 i_want_that new
0 1 1 1
1 2 2 2
2 3 3 3
3 4 4 4
4 5 5 5
5 6 6 6
6 7 7 7
7 8 8 8
8 -1 0 0
9 2 0 0
10 3 0 0
11 4 0 0
12 5 0 0
13 6 0 0
答案 1 :(得分:2)
我在cumprod
的布尔掩码上使用df[0] != -1
。直到它到达第一个-1
,它将乘以False
并变为零。一旦它为零,它就保持为零。然后将其乘以df[0]
。但是,我将其移动以捕获第一个-1
值。
df.assign(new=df[0].ne(-1).shift().fillna(True).cumprod().mul(df[0]))
0 new
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 6 6
6 7 7
7 8 8
8 -1 -1
9 2 0
10 3 0
11 4 0
12 5 0
13 6 0
您可以通过利用底层的numpy数组来提高性能
v = df[0].values
df.assign(new=v * np.append(True, v[:-1] != -1).cumprod())
0 new
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 6 6
6 7 7
7 8 8
8 -1 -1
9 2 0
10 3 0
11 4 0
12 5 0
13 6 0