我试图使用布尔掩码从两个不同的数据帧中获取匹配。
U型
使用逻辑或运算符:
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#将导致3
Python实际要做的是比较这些数字的位:
00000001 | 00000010
结果将是:
00000011 (because 0 | 0 is False, ergo 0; and 0 | 1 is True, ergo 1)
As an integer: 3
它比较数字的每一位,并输出这八个连续操作的结果。这是这些操作员的正常行为。
输入Pandas。由于你可以让这些操作人员超载,熊猫利用了这一点。因此,当使用pandas数据帧时,按位运算符会执行以下操作:
(dataframe1['column']=“表达式”)&(dataframe1['column']!= "another expression)
在这种情况下,第一个熊猫将根据==和的结果创建一系列的真或假!!!). 所以它会将列中的每个值与表达式进行比较,并输出true或false。
那么你会得到两个相同长度的真假序列。然后,它将这两个序列与“and”(&)或“or”(|)进行基本的比较,最后找出一个满足或不满足所有三个比较操作的序列。
更进一步说,我认为在hood下发生的事情是&-操作符实际上调用了pandas的一个函数,给了它们之前评估过的操作(所以操作符左右两边的两个序列)和pandas,然后一次比较两个不同的值,根据内部机制返回一个True或False决定这个。
这基本上与其他所有运算符所使用的原理相同(>,=,当你得到一个漂亮整洁的“和”时,为什么要挣扎并使用不同的表达方式呢?嗯,这似乎是因为“and”只是硬编码,不能手动更改。
!
关于python - Pandas 数据框中的逻辑或/按位或,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39388950/