在 pandas 数据框中逻辑 Or/bitwise 或

Logical Or/bitwise OR in pandas Data Frame

我正在尝试使用布尔掩码从 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

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

就我对这个问题的理解(来自 C++ 背景,目前正在学习 Python 数据科学)我偶然发现了几篇帖子,建议按位运算符 (&、|) 可以重载在 类 中,就像 C++ 一样。

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

1 | 2 # will result in 3

Python实际做的是比较这些数字的位:

00000001 | 00000010

结果将是:

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

整数:3

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

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

(dataframe1['column'] == "expression") & (dataframe1['column'] != "another expression)

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

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

更进一步,我认为幕后发生的事情是 &-运算符实际上调用了 pandas 的函数,为它们提供了先前评估的操作(所以左边的两个系列和运算符的右侧)和 pandas 然后一次比较两个不同的值,返回 True 或 False,具体取决于确定这一点的内部机制。

这与他们用于所有其他运算符(>、<、>=、<=、==、!=)的原则基本相同。

当你得到漂亮整洁的东西时,为什么还要挣扎并使用不同的 &-表达式 "and"?好吧,这似乎是因为 "and" 只是硬编码,无法手动更改。

希望对您有所帮助!