pandas将行与另一行进行比较,并为剩余价值制作欲望值?

时间:2017-04-20 05:53:30

标签: python pandas dataframe

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可以进入任何行

2 个答案:

答案 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
相关问题