考虑以下简单设置:

x = pd.Series([1, 2, 3], index=list('abc'))
y = pd.Series([2, 3, 3], index=list('bca'))

x

a    1
b    2
c    3
dtype: int64

y

b    2
c    3
a    3
dtype: int64

如您所见,索引是相同的,只是顺序不同。

现在,考虑使用相等运算符(==)进行的简单逻辑比较:
x == y
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

抛出ValueError,很可能是因为索引不匹配。另一方面,调用等效的eq运算符可以工作:
x.eq(y)

a    False
b     True
c     True
dtype: bool

OTOH,运算符方法在给定y的情况下可以重新排序...
x == y.reindex_like(x)

a    False
b     True
c     True
dtype: bool

我的理解是,函数和运算符的比较应该做相同的事情,而其他所有条件都相同。运算符比较不执行的eq在做什么?

最佳答案

查看整个回溯,以查找索引不匹配的系列比较,尤其关注异常消息:

In [1]: import pandas as pd
In [2]: x = pd.Series([1, 2, 3], index=list('abc'))
In [3]: y = pd.Series([2, 3, 3], index=list('bca'))
In [4]: x == y
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-73b2790c1e5e> in <module>()
----> 1 x == y
/usr/lib/python3.7/site-packages/pandas/core/ops.py in wrapper(self, other, axis)
   1188
   1189         elif isinstance(other, ABCSeries) and not self._indexed_same(othe
r):
-> 1190             raise ValueError("Can only compare identically-labeled "
   1191                              "Series objects")
   1192
ValueError: Can only compare identically-labeled Series objects

我们看到这是一个有意实现的决定。而且,这不是Series对象所独有的-DataFrames会引发类似的错误。

最终,通过挖掘有关相关代码的Git责任,最终会发现一些相关的提交和问题跟踪线程。例如,Pandas的作者韦斯·麦金尼(Wes McKinney)曾经用Series.__eq__完全忽略RHS的索引,而在关于该行为的错误报告的comment中,则表示:



这就是changed到 Pandas 0.19.0中的当前行为。引用"what's new" page:



这使得Series行为与DataFrame的行为相匹配,DataFrame在比较中已经拒绝了不匹配的索引。

总而言之,使比较运算符自动对齐索引会破坏太多内容,因此这是最佳选择。

关于python - 为什么 Pandas 逻辑运算符不像应该那样在索引上对齐?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56402988/

10-16 12:04