考虑一下这个简单的设置:
X = pd.Series ([1,2,3],索引 = list ('abc'))
Y = pd.Series ([2,3,3],索引 = list ('bca'))
X
A 1
B 2
C 3
Dtype: int64
Y
B 2
C 3
一个 3
Dtype: int64
正如你所看到的,索引是相同的,只是顺序不同。
现在,考虑使用等式 (==
) 操作员:
X> y
--------------------------------------------------------------------------------
ValueError 反向追踪 (最近一次打电话过去)
这抛出一个ValueError
, most likely because the indexes do not match. On the other hand, calling the equivalent eq
操作员工作:
等式 (y)
假的
B 真
C 真
D 型: 布尔
Operator h,给定的操作方法y
第一次重新订购.
X = = y.reindex _ like (x)
假的
B 真
C 真
D 型: 布尔
我的理解是,函数和运算符比较应该做同样的事情,所有其他事情都是一样的。是什么eq
运营商比较不这样做?
查看与不匹配索引的系列比较的整个回溯,特别是关注异常消息:
在 [1]: 进口熊猫作为 pd
在 [2] 中: x = pd.Series ([1,2,3],索引 = list ('abc'))
在 [3] 中: y = pd.Series ([2,3],索引 = list ('bca'))
[4] 中: x = y
--------------------------------------------------------------------------------
ValueError 反向追踪 (最近一次打电话过去)
在()
-> 1 x = = y
/Usr/lib/python3.7/站点-包装中的包/pandas/core/ops.py (自、其他、轴)
1188
1189 elif isinstance (其他,abc 系列),而不是 self._ index _ same (othe
R):
-> 1190 raise value error (“只能比较同标签”)
1191 “系列对象”)
1192
Value error: 只能比较标记相同的系列对象
我们认为这是一个深思熟虑的执行决定。此外,这不是系列对象独有的 -- ames rames 会引发类似的错误。
挖掘相关行的 Git blame 最终会发现一些相关的提交和问题跟踪线程。例如,Series.__eq__
以前完全忽略 RHS 的索引,在评论熊猫作者韦斯 · 麦金尼在一份关于这种行为的错误报告中说:
这实际上是一个功能/刻意的选择,而不是一个 bug 相关的652。早在 1 月,我把比较方法改为 自动对齐,但是发现它导致了大量的错误/ 用户,特别是许多 NumPy 函数的中断 ( 经常做一些事情
arr[1:] == arr[:-1]
; example:np.unique
) 停止工作这又回到了系列不太像 ndarray 的问题 足够了,可能不应该是 ndarray 的子类。
所以,除了这一点,我没有给你一个好的答案; 自动对齐将是理想的,但是除非我 让系列不是 ndarray 的子类。我认为这可能是一个好 想法,但直到 0.9 或 0.10 (几个月下来) 才可能发生 路)。
这是当时改变了熊猫 0.19.0 中的当前行为。引用“有什么新的” 页面:
更改了以下系列运算符,使所有运算符 一致,包括数据框 (GH1134, GH4581, GH13538)
- 当索引不同时,序列比较运算符现在会引发 value error。
- 系列逻辑运算符将左侧和右侧的索引对齐。
这使得系列行为与 DataFrame 的行为相匹配,DataFrame 在比较中已经拒绝了不匹配的索引。
总之,让比较运算符对齐索引会自动破坏太多的内容,所以这是最好的选择。
我喜欢 python 的一件事是,你可以在几乎任何东西的源代码中找到峰值。而从pd.Series.eq
源代码,它调用:
Def flex _ wrapper (self,other,level = None,fill _ value = None,axis = 0):
# 其他东西
#..
如果是实例 (其他,abc 系列):
返回 self._ binop (其他,op,level = level,fill _ value = fill _ value)
继续说下去pd.Series._binop
:
Def _ binop (self,other,level,level = None,fill _ value = None):
# 其他东西
#..
如果不是 self.index.equals (其他.index):
此,其他 = 自对齐 (其他,级别 = 级别,连接 = “外部”,
Copy = False)
New _ index = this.index
这意味着eq
operator aligns the two series before comparison (which, apparently, the normal operator ==
不)。
回到我们没有的 2012 年eq
, ne
and gt
, pandas
have the problem : disorder Series
will return the unexpected output with logic (>,<,==,!=
) , so they doing with a fix (new function added, gt
,ge
,ne
..)
GitHub 门票参考