对数据帧的两列进行逻辑运算

时间:2016-01-27 17:10:56

标签: pandas boolean-operations

在pandas中,我想创建一个计算列,它是另外两列的布尔运算。

在pandas中,很容易将两个数字列相加。我想用逻辑运算符AND做类似的事情。这是我的第一次尝试:

In [1]: d = pandas.DataFrame([{'foo':True, 'bar':True}, {'foo':True, 'bar':False}, {'foo':False, 'bar':False}])

In [2]: d
Out[2]: 
     bar    foo
0   True   True
1  False   True
2  False  False

In [3]: d.bar and d.foo   ## can't
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

所以我猜逻辑运算符与pandas中的数字运算符的工作方式不同。我尝试使用bool()

执行错误消息建议的内容
In [258]: d.bar.bool() and d.foo.bool()  ## spoiler: this doesn't work either
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我找到了一种方法,可以将布尔列转换为int,将它们加在一起并作为布尔值进行评估。

In [4]: (d.bar.apply(int) + d.foo.apply(int)) > 0  ## Logical OR
Out[4]: 
0     True
1     True
2    False
dtype: bool

In [5]: (d.bar.apply(int) + d.foo.apply(int)) > 1  ## Logical AND
Out[5]: 
0     True
1    False
2    False
dtype: bool

这是令人费解的。还有更好的方法吗?

2 个答案:

答案 0 :(得分:32)

是的,还有更好的方法!只需使用&元素逻辑和运算符:

d.bar & d.foo

0     True
1    False
2    False
dtype: bool

答案 1 :(得分:1)

此外,还有另一个您可以乘以AND或为OR加法。无需像您所做的那样进行转换和额外的比较。

print(d.foo * d.bar) # AND operation print(d.foo + d.bar) # OR operation