Pandas 根据 3 列值是全部为负数还是全部为正数创建布尔列

Pandas create boolean column based on whether 3 column values are all negative or all positive

提问人:anarchy 提问时间:1/9/2022 更新时间:1/11/2022 访问量:221

问:

我有以下数据框,

       f1           f2      f3  f4  f5          f6          f7
0   -0.004446   59.763107   x0  0   60.029999   59.160000   -0.014493
1   -0.003414   113.212220  x1  0   113.599998  113.650002  0.000440
2   -0.013123   36.435513   x2  1   36.919998   36.889999   -0.000813
3   0.003558    68.854090   x3  0   68.420158   68.410179   -0.000146
4   -0.006840   23.021446   x4  0   23.180000   23.100000   -0.003451
... ... ... ... ... ... ... ...
145 0.000724    253.113110  x5  1   252.929993  247.210007  -0.022615
146 0.006567    128.236680  x6  0   127.400002  127.059998  -0.002669
147 -0.009016   610.079200  x7  1   615.630005  605.369995  -0.016666
148 -0.011290   165.173920  x8  0   167.059998  158.300003  -0.052436
149 0.021474    358.496370  x9  0   350.959991  343.329987  -0.021740

基本上,对于列,将 0 视为负数或 False,将 1 视为正数或 True。f4

如果列中的值 和 全部为负数或全部为正数,则测试列应为该行返回 true,否则应返回 false。f1f4f7

我想创建名为“测试”的新列,该列将根据我的条件说或。如果在任何情况下,其中一个不匹配(不是全部为真或不全是假),它将显示 .TrueFalseFalse

我可以使以下代码与 2 列一起使用,

df.loc[:,'test'] = df['f1'].ge(0).eq(df['f4'])

而且效果很好。

但是,如果我尝试链接它以像这样添加列,f7

df.loc[:,'test'] = df['f1'].ge(0).eq(df['f4']).eq(df['f7'].ge(0))

结果是错误的。

我希望测试列看起来像这样,

       f1           f2      f3  f4  f5          f6          f7         test
0   -0.004446   59.763107   x0  0   60.029999   59.160000   -0.014493  True
1   -0.003414   113.212220  x1  0   113.599998  113.650002  0.000440   False
2   -0.013123   36.435513   x2  1   36.919998   36.889999   -0.000813  False
3   0.003558    68.854090   x3  0   68.420158   68.410179   -0.000146  False
4   -0.006840   23.021446   x4  0   23.180000   23.100000   -0.003451  True
... ... ... ... ... ... ... ...
145 0.000724    253.113110  x5  1   252.929993  247.210007  -0.022615  False
146 0.006567    128.236680  x6  0   127.400002  127.059998  -0.002669  False
147 -0.009016   610.079200  x7  1   615.630005  605.369995  -0.016666  False
148 -0.011290   165.173920  x8  0   167.059998  158.300003  -0.052436  True
149 0.021474    358.496370  x9  0   350.959991  343.329987  -0.021740  False

如何让代码按照我想要的方式工作?

python 熊猫 布尔 逻辑

评论

0赞 Marat 1/9/2022
你能试试吗?df[['f1', 'f4', 'f7']].ge(0).sum(axis=1).isin([0, 3])
0赞 anarchy 1/9/2022
@Marat这行不通,因为 f4 必须是 1 不大于或等于 0?
0赞 Marat 1/10/2022
然后(df['f4'] + df[['f1', 'f7']].ge(0)).sum(axis=1).isin([0, 3])
0赞 anarchy 1/10/2022
@Marat现在一切都是真的
0赞 anarchy 1/10/2022
我检查了你的总和公式,一切都显示为 NaN

答:

1赞 Luana Kwon 1/9/2022 #1

也许是因为 如果 F1 和 F4 为负数,则前两个比较将返回正数,因此链接第三个比较将返回 false。

我认为您要做的是对异或操作的否定。
下面的代码将为您提供想法。

table = np.array(
   [[-5.5,0,-6.6],
    [-5.5,0, 6.6],
    [-5.5,1,-6.6],
    [-5.5,1, 6.6],
    [ 5.5,0,-6.6],
    [ 5.5,0, 6.6],
    [ 5.5,1,-6.6],
    [ 5.5,1, 6.6]]
)

pd_table = pd.DataFrame(table)

df = pd_table
and_all = df[0].ge(0) & df[1] & df[2].ge(0)
or_all = df[0].ge(0) | df[1] | df[2].ge(0)

print(and_all.eq(or_all))

输出将如下所示:

0     True
1    False
2    False
3    False
4    False
5    False
6    False
7     True
dtype: bool

评论

0赞 anarchy 1/10/2022
嘿,它没有用,我遇到了一个案例,其中 f1 是 -ve,f4 是 1,f7 是 -ve 并且是真的
0赞 Luana Kwon 1/11/2022
对不起,我没有验证我上次写的代码,它不正确。我编辑了答案。希望这会有所帮助
0赞 anarchy 1/11/2022
你能解释一下为什么你同时使用abs和or吗?我以为它应该只是和
0赞 Luana Kwon 1/11/2022
据我所知,“&”和“|”分别是元素 AND 和 OR。
0赞 Luana Kwon 1/11/2022
我不确定是否有其他方法可以做到这一点,但就我而言,我写下了真相表并试图将其放入其中。