【问题标题】:Logical Or/bitwise OR in pandas Data Frame熊猫数据框中的逻辑或/按位或
【发布时间】:2017-01-16 06:27:33
【问题描述】:

我正在尝试使用布尔掩码从 2 个不同的数据帧中获取匹配项。 你

使用逻辑或运算符:

x = df[(df['A'].isin(df2['B']))
      or df['A'].isin(df2['C'])]

Output:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

但是使用按位或运算符,结果会成功返回。

x = df[(df['A'].isin(df2['B']))
      | df['A'].isin(df2['C'])]

Output: x

两者有区别吗?按位 OR 是这里的最佳选择吗?为什么逻辑 OR 不起作用?

【问题讨论】:

  • 是的,基本上是因为逻辑上还是不能重载。
  • 您好编辑了我的问题。我真的很好奇为什么逻辑 OR 不起作用。
  • 您在比较数组,而不是 or 无法理解的标量值,因此需要按位使用 |
  • 谢谢。我可能应该阅读更多关于基本功能的内容。
  • 但最好用and 解释here,但同样适用于or

标签: python pandas bitwise-operators logical-operators


【解决方案1】:

据我了解这个问题(来自 C++ 背景,目前正在学习 Python 进行数据科学),我偶然发现了几篇文章,表明位运算符(&、|)可以在类中重载,就像 C++ 一样会的。

所以基本上,虽然您可以对数字使用此类按位运算符,但它们会比较位并为您提供结果。例如,如果您有以下情况:

1 | 2 # 将导致 3

Python 实际上会比较这些数字的位:

00000001 | 00000010

结果将是:

00000011(因为 0 | 0 为假,故为 0;而 0 | 1 为真,故为 1)

作为整数:3

它比较数字的每一位并吐出这八个连续操作的结果。这是这些运算符的正常行为。

输入熊猫。由于您可以重载这些运算符,Pandas 已经利用了这一点。因此,在处理 pandas 数据帧时,按位运算符的作用如下:

(dataframe1['column'] == "表达式") & (dataframe1['column'] != "另一个表达式)

在这种情况下,首先 pandas 将根据 == 和 != 操作的结果创建一系列真或假(注意:你必须在外部表达式周围加上大括号,因为 python 总是会尝试解析第一个按位运算符,然后解析其他比较运算符!!)。所以它会将列中的每个值与表达式进行比较,并输出真或假。

那么你会有两个相同长度的真假序列。 THEN 所做的就是取这两个系列,基本上将它们与“and”(&)或“or”(|)进行比较,最后吐出一个系列,满足或不满足所有三个比较操作。

更进一步,我认为幕后发生的事情是 & 运算符实际上调用了 pandas 的函数,为它们提供了先前评估的操作(因此运算符左右两个系列)和然后 pandas 一次比较两个不同的值,根据内部机制返回 True 或 False。

这与他们用于所有其他运算符(>、=、

当你得到漂亮而整洁的“and”时,为什么要使用不同的 & 表达式?嗯,这似乎是因为“and”只是硬编码,不能手动更改。

希望有帮助!

【讨论】:

  • 谢谢!抱歉,回复晚了,解释清楚地打破了它。了解幕后发生的事情。
  • 很好,清晰的解释。尽管我很早就知道这是如何工作的,但我从来没有费心去思考“为什么”。我通常会为我自己的逻辑/注释添加无关的括号,所以如果我不这样做,我可能会更早想到。
  • 原来我需要().. 谢谢。
猜你喜欢
  • 2023-01-09
  • 2019-09-20
  • 2018-11-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多