Python 熊猫将一行与另一行进行比较,并将期望值作为剩余值?

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

如果“0”值为-1,则所有剩余的行在某个时候都将为零 -1可以出现在任何行中

您可以将其用于第一个-1的索引,然后使用以下内容覆盖从该索引到第0列末尾的所有值:

另一种解决方案是通过获取布尔掩码,然后通过以下方式覆盖值:

我会在df[0]的布尔掩码上使用cumprod!=-1.它将是一,直到它到达第一个-1,在这一点上它乘以False并变为零。一旦它为零,它就保持为零。然后将其乘以df[0]。但是,我将其转换为捕获第一个-1值

您可以通过利用底层numpy阵列来提高性能

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