提问人:anarchy 提问时间:1/9/2022 更新时间:1/11/2022 访问量:221
Pandas 根据 3 列值是全部为负数还是全部为正数创建布尔列
Pandas create boolean column based on whether 3 column values are all negative or all positive
问:
我有以下数据框,
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。f1
f4
f7
我想创建名为“测试”的新列,该列将根据我的条件说或。如果在任何情况下,其中一个不匹配(不是全部为真或不全是假),它将显示 .True
False
False
我可以使以下代码与 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
如何让代码按照我想要的方式工作?
答:
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
我不确定是否有其他方法可以做到这一点,但就我而言,我写下了真相表并试图将其放入其中。
评论
df[['f1', 'f4', 'f7']].ge(0).sum(axis=1).isin([0, 3])
(df['f4'] + df[['f1', 'f7']].ge(0)).sum(axis=1).isin([0, 3])