根据条件熊猫宣传价值

时间:2020-02-06 15:57:52

标签: python pandas

说我有像这样的pandas数据框: enter image description here

现在,如果该行中已经发生1,我想将所有1更新为0。因此,新的df将如下所示: enter image description here

df = pd.DataFrame({"Col_A":[0, 1, 0, 1, 1], "Col_B":[1, 0, 0, 0, 1],
             "Col_C":[0, 0, 0, 0, 1],"Col_D":[1, 1, 0, 0, 1],
             "Col_E":[0, 0, 1, 0, 1]})

我想知道是否有一种有效的方法可以在熊猫中实现这一目标。当前,我遍历每一行,然后遍历每一列,然后保留一个标志以检查是否已发生1,然后更新这些值。

1 个答案:

答案 0 :(得分:2)

设置

import numpy as np
df = pd.DataFrame(np.random.randint(2,size = (10,10)))
print(df)
   0  1  2  3  4  5  6  7  8  9
0  0  0  1  0  0  1  0  0  0  1
1  0  0  0  0  0  1  1  1  1  1
2  0  1  0  1  0  1  0  0  0  1
3  1  0  0  1  0  1  0  0  1  1
4  1  0  1  1  0  1  0  0  0  0
5  0  1  1  1  1  0  1  0  1  1
6  0  0  0  1  1  0  0  0  1  0
7  1  1  1  1  1  0  0  0  1  1
8  0  0  0  0  0  1  1  0  1  1
9  0  0  0  1  0  0  0  1  0  1

解决方案

Series.cumsumSeries.shift一起使用DataFrame.mask进行蒙版

df.mask(df.cumsum(axis = 1).shift(axis = 1).gt(0),0)

   0  1  2  3  4  5  6  7  8  9
0  0  0  1  0  0  0  0  0  0  0
1  0  0  0  0  0  1  0  0  0  0
2  0  1  0  0  0  0  0  0  0  0
3  1  0  0  0  0  0  0  0  0  0
4  1  0  0  0  0  0  0  0  0  0
5  0  1  0  0  0  0  0  0  0  0
6  0  0  0  1  0  0  0  0  0  0
7  1  0  0  0  0  0  0  0  0  0
8  0  0  0  0  0  1  0  0  0  0
9  0  0  0  1  0  0  0  0  0  0

输出OP数据框

print(df.mask(df.cumsum(axis = 1).shift(axis = 1).gt(0),0))
   Col_A  Col_B  Col_C  Col_D  Col_E
0      0      1      0      0      0
1      1      0      0      0      0
2      0      0      0      0      1
3      1      0      0      0      0
4      1      0      0      0      0

另一种可行的解决方案:DataFrame.clip

df.sub(df.cumsum(1)).add(df).clip(lower = 0)