Pandas数据框中的逻辑或/按位或

11
我将使用布尔蒙板从两个不同的数据框中获取匹配项。 使用逻辑或运算符:
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

这两者有什么区别?使用按位或运算符是否是最佳选择?为什么逻辑或运算符不起作用?


4
是的,基本上是因为逻辑或(logical or)无法重载。 - ayhan
嗨,我编辑了我的问题。我只是非常好奇逻辑“或”为什么不能正常工作。 - BernardL
1
你正在比较数组,而不是标量值,这是 or 不理解的,因此需要使用按位 | - jezrael
谢谢。我可能应该更多地阅读基本函数的内容。 - BernardL
1
但更好的解释在这里,使用and也可以,但使用or同样适用。 - jezrael
1个回答

26
据我所了解(我有C ++背景,目前正在学习Python进行数据科学),我发现许多帖子建议可以在类中重载位运算符(& |),就像C++一样。
因此,当您在数字上使用这些位运算符时,它们将比较位并给出结果。例如,如果您有以下内容:
1 | 2#将得到3
Python实际上会比较这些数字的位:
00000001 | 00000010
结果将是:
00000011(因为0 | 0为False,因此为0;而0 | 1为True,因此为1)
作为整数:3
它比较每个数字的每个位,并吐出这八个连续操作的结果。这是这些运算符的正常行为。
然后是Pandas。由于可以重载这些运算符,因此Pandas已经利用了这一点。因此,当涉及到Pandas数据框时,位运算符所做的是:
(dataframe1 [ 'column '] ==“expression”)&(dataframe1 [ 'column']!=“another expression”)
在这种情况下,首先Pandas将创建根据==和!=操作的结果的一系列真或假(要小心:必须在外部表达式周围放置括号,因为python始终会首先解析按位运算符,然后是其他比较运算符!)。因此,它将比较列中的每个值与表达式,并输出真或假。
然后,您将有两个同长度的真和假系列。接下来,它将使用“and”(&)或“or”(|)将这两个系列进行比较,并最终吐出一个单一的系列,无论是否满足所有三个比较操作。为了更深入的理解,我认为在幕后发生的事情是 &-运算符实际上调用了 pandas 的一个函数,给它们之前评估过的操作(即运算符左右两侧的两个序列),然后 pandas 比较每次不同的值,并根据内部机制返回 True 或 False。
基本上,这就是他们用于所有其他运算符的原则(>,<,>=,<=,==,!=)。
为什么要费力地使用不同的 &-表达式,而不使用漂亮简洁的 "and"?那似乎是因为 "and" 是硬编码的,无法手动更改。
希望这能帮到您!

2
谢谢!抱歉回复晚了,这个解释清晰地分解了它。让人了解发生了什么。 - BernardL
1
非常好的、清晰的解释。虽然我已经知道这个工作原理很长时间了,但我从来没有费心去思考“为什么”。我通常会在我的逻辑/注释中包含多余的括号,如果我不这样做,也许我会更早地想到这一点。 - Jeff Ellen
原来我需要 ().. 谢谢。 - WillZ
1
我最近刚开始做一个pandas项目,这一直困扰着我。感谢你的解释,已经收藏了。 - David Clarke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接