Python 熊猫将一行与另一行进行比较,并将期望值作为剩余值?
如果“0”值为-1,则所有剩余的行在某个时候都将为零 -1可以出现在任何行中您可以将其用于第一个-1的索引,然后使用以下内容覆盖从该索引到第0列末尾的所有值: 另一种解决方案是通过获取布尔掩码,然后通过以下方式覆盖值: 我会在df[0]的布尔掩码上使用cumprod!=-1.它将是一,直到它到达第一个-1,在这一点上它乘以False并变为零。一旦它为零,它就保持为零。然后将其乘以df[0]。但是,我将其转换为捕获第一个-1值 您可以通过利用底层numpy阵列来提高性能Python 熊猫将一行与另一行进行比较,并将期望值作为剩余值?,python,pandas,dataframe,Python,Pandas,Dataframe,如果“0”值为-1,则所有剩余的行在某个时候都将为零 -1可以出现在任何行中您可以将其用于第一个-1的索引,然后使用以下内容覆盖从该索引到第0列末尾的所有值: 另一种解决方案是通过获取布尔掩码,然后通过以下方式覆盖值: 我会在df[0]的布尔掩码上使用cumprod!=-1.它将是一,直到它到达第一个-1,在这一点上它乘以False并变为零。一旦它为零,它就保持为零。然后将其乘以df[0]。但是,我将其转换为捕获第一个-1值 您可以通过利用底层numpy阵列来提高性能 df.assign(new
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
我可以在新[8]之后选择-1值,然后像我的编辑示例一样添加1-df.loc[df[0]==-1.idxmax+1:,0]=0,对于第二个解决方案掩码=df[0]=-1.cumsum!=0.shift mask.iloc[0]=False
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
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
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
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