pandas数据帧中的逻辑或/按位OR

时间:2016-09-08 10:47:48

标签: python pandas bitwise-operators logical-operators

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

使用逻辑OR运算符:

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().

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

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

Output: x

这两者是否存在差异,并且按位或者是最佳选择?为什么逻辑OR不起作用?

1 个答案:

答案 0 :(得分:8)

据我所知,这个问题(来自C ++背景,目前正在学习数据科学的Python),我偶然发现了一些帖子,表明按位运算符(&,|)可以在类中重载,就像C ++可以。

基本上,虽然你可以在数字上使用这样的按位运算符,但它们会比较这些位并给出结果。例如,如果您有以下内容:

  

1 | 2#将导致3

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

  

00000001 | 00000010

结果将是:

00000011(因为0 | 0为False,ergo 0; 0 | 1为True,ergo 1)

整数:3

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

输入Pandas。由于你可以重载这些操作符,Pandas已经使用了这个。那么,在进入pandas数据帧时,运算符的位运算如下:

  

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

在这种情况下,第一个pandas将根据==和!=操作的结果创建一系列的真实或谬误(要小心:你必须在外部表达式周围放置大括号,因为python总是会尝试解决第一个按位运算符,然后解析其他比较运算符!! )。因此,它会将列中的每个值与表达式进行比较,并输出true或false。

然后你会有两个相同长度的真理和谬误系列。它的作用是采取这两个系列,并基本上将它们与“和”(&)或“或”(|)进行比较,最后吐出一个系列,或者完成或不完成所有三个比较操作。

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

这基本上与他们用于所有其他运营商的原则相同(>,<,> =,< =,==,!=)。

当你得到漂亮又整洁的“和”时,为什么要挣扎并使用不同的& -expression?好吧,这似乎是因为“和”只是硬编码而且无法手动更改。

希望有所帮助!