为什么 pandas 逻辑运算符不像它应该的那样在索引上对齐?

共3个回答,已解决, 标签: python pandas

考虑一下这个简单的设置:

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个答案(采用)

查看与不匹配索引的系列比较的整个回溯,特别是关注异常消息:

在 [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 在比较中已经拒绝了不匹配的索引。

总之,让比较运算符对齐索引会自动破坏太多的内容,所以这是最好的选择。

第2个答案

我喜欢 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 ==不)。

第3个答案

回到我们没有的 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 门票参考

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 如何破坏 Python 对象并释放内存 将具有特殊格式的文本文档转换为熊猫数据框架 用两本字典绘制一只熊猫专栏图