Python 为什么熊猫是'==';与';不同;。eq()';
考虑系列Python 为什么熊猫是'==';与';不同;。eq()';,python,pandas,Python,Pandas,考虑系列s s = pd.Series([(1, 2), (3, 4), (5, 6)]) 这是意料之中的 s == (3, 4) 0 False 1 True 2 False dtype: bool 这不是 s.eq((3, 4)) 我认为他们是一样的。他们之间有什么区别 该怎么说? 等效于series==other,但支持用fill_值替换其中一个输入中缺失的数据 这似乎意味着它们应该是相同的,因此产生了混淆。=是一种元素级比较,产生真值向量,而.eq是一种“这
s
s = pd.Series([(1, 2), (3, 4), (5, 6)])
这是意料之中的
s == (3, 4)
0 False
1 True
2 False
dtype: bool
这不是
s.eq((3, 4))
我认为他们是一样的。他们之间有什么区别
该怎么说? 等效于series==other,但支持用fill_值替换其中一个输入中缺失的数据
这似乎意味着它们应该是相同的,因此产生了混淆。
=
是一种元素级比较,产生真值向量,而.eq
是一种“这两个iterables是相等的”,对于这两个iterables,长度相同是一个要求。Ayhan指出了一个例外:当您使用.eq(标量值)
比较一个向量类型时,标量值只需广播到相同大小的向量进行比较。您遇到的实际上是一种特殊情况,它使比较pandas.Series
或numpy.ndarray
与普通python构造更容易。源代码如下:
def flex_wrapper(self, other, level=None, fill_value=None, axis=0):
# validate axis
if axis is not None:
self._get_axis_number(axis)
if isinstance(other, ABCSeries):
return self._binop(other, op, level=level, fill_value=fill_value)
elif isinstance(other, (np.ndarray, list, tuple)):
if len(other) != len(self):
# ---------------------------------------
# you never reach the `==` path because you get into this.
# ---------------------------------------
raise ValueError('Lengths must be equal')
return self._binop(self._constructor(other, self.index), op,
level=level, fill_value=fill_value)
else:
if fill_value is not None:
self = self.fillna(fill_value)
return self._constructor(op(self, other),
self.index).__finalize__(self)
您点击的是ValueError
,因为pandas假设.eq
需要将值转换为numpy.ndarray
或pandas.Series
(如果您给它一个数组、列表或元组),而不是实际将其与元组进行比较。例如,如果您有:
s = pd.Series([1,2,3])
s.eq([1,2,3])
您不希望它将每个元素与[1,2,3]
进行比较
问题在于object
数组(与dtype=uint
一样)经常从裂缝中滑出或故意忽略。一个简单的if self.dtype!='对象“
该方法内的分支可以解决此问题。但也许开发者有充分的理由让这个案例与众不同。我建议通过在他们的网站上发布来要求澄清
您还没有询问如何使其正确工作,但为了完整性,我将包括一种可能性(根据源代码,您可能需要将其包装为pandas.Series
您自己):
当你实际使用标量时,它会播放:s.eq(3)
。@piRSquared:现在你最好在帖子中添加一些研究成果的证据!一开始你只是说你假设了X的东西,然后就这样了
s = pd.Series([1,2,3])
s.eq([1,2,3])
>>> s.eq(pd.Series([(1, 2)]))
0 True
1 False
2 False
dtype: bool