在 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" 只是硬编码,无法手动更改。
希望对您有所帮助!
我正在尝试使用布尔掩码从 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" 只是硬编码,无法手动更改。
希望对您有所帮助!