【问题标题】:Pandas create boolean column based on whether 3 column values are all negative or all positivePandas 根据 3 列值是全为负数还是全为正数创建布尔列
【发布时间】:2022-01-08 22:18:06
【问题描述】:

我有以下数据框,

       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

基本上,对于列 f4,将 0 视为否定或 False,将 1 视为肯定或 True。

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

我想创建一个名为“测试”的新列,根据我的条件显示TrueFalse。如果在任何情况下,其中一个不匹配(不是全部为真或不是全部为假),它将显示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

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

【问题讨论】:

  • 你能试试df[['f1', 'f4', 'f7']].ge(0).sum(axis=1).isin([0, 3])吗?
  • @Marat 那行不通,因为 f4 必须是 1 不大于或等于 0?
  • 那么,(df['f4'] + df[['f1', 'f7']].ge(0)).sum(axis=1).isin([0, 3])
  • @Marat 现在一切都变得真实了
  • 我检查了你的求和公式,结果都是 NaN

标签: python pandas boolean boolean-logic


【解决方案1】:

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

我认为您正在尝试做的是 XOR 操作的负数。
下面的代码会给你这个想法。

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

【讨论】:

  • 嘿,没用,我遇到了一个例子,f1 是 -ve,f4 是 1,f7 是 -ve,结果是真的
  • 对不起,我没有验证我上次写的代码,它是不正确的。我编辑了答案。希望这会有所帮助
  • 你能解释一下为什么你同时使用 abs 和 or 吗?我认为它应该只是和
  • 我不确定你所说的 abs 是什么意思。 '&' 和 '|'据我所知,每个元素都是 AND 和 OR。
  • 我不确定是否有其他方法可以做到这一点,但就我而言,我写下了真值表并尝试将其放入。
猜你喜欢
  • 2019-11-21
  • 2022-08-03
  • 2021-09-02
  • 1970-01-01
  • 2013-09-15
  • 2022-11-17
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多