说我有像这样的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,然后更新这些值。
答案 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.cumsum
与Series.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)