Pandas:两个布尔系列的求和

10
在Python中:
In [1]: True+True
Out[1]: 2

所以在以下步骤设置完成后:
import pandas as pd
ser1 = pd.Series([True,True,False,False])
ser2 = pd.Series([True,False,True,False])

我想要的是找到ser1ser2的逐元素求和,其中布尔值被视为整数进行加法运算,就像Python示例中一样。
但是Pandas将加法视为逐元素"或"运算符,并给出以下(不期望的)输出:
In [5]: ser1+ser2
*/lib/python2.7/site-packages/pandas/computation/expressions.py:184: UserWarning: evaluating in Python space because the '+' operator is not supported by numexpr for the bool dtype, use '|' instead
  unsupported[op_str]))
Out[5]: 
0     True
1     True
2     True
3    False
dtype: bool

我知道我可以使用astype(int)在两个序列上获得我期望的输出:
In [6]: ser1.astype(int) + ser2
Out[6]: 
0    2
1    1
2    1
3    0
dtype: int64

还有其他更“泛用”的方法来获得[2,1,1,0]序列吗?为什么简单的序列加法在这里无法奏效,有没有好的解释?


6
我不确定我理解了:如果你想把布尔系列当作整数而不是布尔值来处理,调用astype(int)似乎是最简单的方法。你需要什么样的解释? - DSM
好的,我看到它可以工作。我的问题更多是关于为什么Pandas中的Series +操作与逐元素的Python +操作不会给出相同的结果。 - exp1orer
2个回答

6

请使用&代替+

import pandas as pd
ser1 = pd.Series([True,True,False,False])
ser2 = pd.Series([True,False,True,False]) 

print(ser1 & ser2) 

>> 0     True
>> 1    False
>> 2    False
>> 3    False
>> dtype: bool

3

如果我理解正确,您所需要的是基于numpy bool数组的操作约定,而不是Python bool。

>>> a = True
>>> a+a
2
>>> import numpy as np
>>> np.array([a])
array([ True], dtype=bool)
>>> np.array([a]) + np.array([a])
array([ True], dtype=bool)

这个问题可能有两种不同的解决方法,如果我没记错的话,至少有一位pandas开发者对此行为感到惊讶,但是这样做符合Series具有类型的概念。


是的!这正是我正在寻找的。虽然我猜这将把问题推到更深的层次——你知道为什么这是numpy中的约定吗? - exp1orer
2
@exp1orer 在这些逐元素的布尔运算聚合中,“+”实际上是“&”,而“-”是“|”。由于“True”和“True”的总和实际上是未定义的。因此,有人可能会认为Python实际上正在执行一项非Python操作(它实际上首先进行强制转换为int)。但通常不会在numpy / pandas中进行强制转换。在我看来,这是不符合Python风格的。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接