在Python Pandas中,布尔运算

8

我正在对两个序列执行布尔运算。我原本期望布尔运算会自动根据相同的索引进行操作。但实际上它只按顺序进行操作。这是预期的行为还是有其他不同的方法可以做到这一点?谢谢。

b
Out[47]: 
AEIS    False
AAPL     True
ACFN    False
Name: OldPosition, dtype: bool

a
Out[48]: 
AAPL     True
ACFN    False
AEIS     True
dtype: bool

a&b
Out[50]: 
AAPL    False
ACFN    False
AEIS    False
dtype: bool

我认为这是意外的... - Andy Hayden
2个回答

9
这对我来说似乎是一个bug
In [1]: a = pd.Series([True, False, True], list('bca'))

In [2]: b = pd.Series([False, True, False], list('abc'))

In [3]: a & b
Out[3]:
b    False
c    False
a    False
dtype: bool

一种解决方法是使用相同的索引进行重新索引:
In [4]: index = a.index | b.index

In [5]: a.reindex(index) & b.reindex(index)
Out[5]:
a    False
b     True
c    False
dtype: bool

2
注意:此行为将在0.13版本中得到修复。 - Andy Hayden
已经修复。第19版没有这个问题。 - Yonatan Simson

2
如果您有相同长度的Series,您应该能够使用一个Series的索引来排序另一个Series,以满足您的需求。
In [15]: a[b.index]
Out[15]:
a     True
b     True
c    False
dtype: bool

In [16]: b
Out[16]:
a    False
b     True
c    False
dtype: bool

In [17]: a[b.index] & b
Out[17]:
a    False
b     True
c    False
dtype: bool

我可以确认,截至pandas 0.17.1版本,所需功能已经就位。

In [1]: import pandas as pd

In [2]: a = pd.Series([True, False, True], list('bca'))

In [3]: b = pd.Series([False, True, False], list('abc'))

In [4]: b & a
Out[4]:
a    False
b     True
c    False

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