考虑一下这个简单的设置:
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
如您所见,索引是相同的,只是顺序不同。在
现在,考虑使用相等(==
)运算符进行一个简单的逻辑比较:
这将抛出一个ValueError
,很可能是因为索引不匹配。另一方面,{cd3>调用另一个操作符起作用:
x.eq(y)
a False
b True
c True
dtype: bool
在给定{
x == y.reindex_like(x)
a False
b True
c True
dtype: bool
我的理解是函数和运算符的比较应该做同样的事情,所有其他的事情都是一样的。运算符比较没有做的eq
在做什么?在
我喜欢python的一点是,你几乎可以在源代码中找到任何东西。并且从
pd.Series.eq
源代码调用:然后转到
^{pr2}$pd.Series._binop
:这意味着
eq
运算符在比较之前对两个序列进行对齐(显然,正常运算符==
没有)。在回到2012年,当我们没有},
eq
,ne
和{pandas
有一个问题:无序Series
将返回带有逻辑(>,<,==,!=
)的意外输出,因此他们做了一个修复(添加了新函数,gt
,ge
,ne
….)GitHub票证reference
查看具有不匹配索引的序列比较的整个回溯,尤其关注异常消息:
我们认为,这是一项深思熟虑的执行决定。此外,这并不是Series对象所独有的,数据帧也会引发类似的错误。在
挖掘相关行的Git错误最终会找到一些相关的提交和问题跟踪线程。例如,
Series.__eq__
用来完全忽略RHS的索引,而在comment关于该行为的bug报告中,Pandas作者韦斯·麦金尼(Wes McKinney)说:这就是熊猫0.19.0中当前行为的changed。引用"what's new" page:
这使得序列行为与DataFrame的行为相匹配,DataFrame已经在比较中拒绝了不匹配的索引。在
总之,让比较运算符自动对齐索引会破坏太多内容,所以这是最好的选择。在
相关问题 更多 >
编程相关推荐