考虑系列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))
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) ValueError: Lengths must be equal
我认为他们是一样的。他们之间有什么区别?
documentation说什么?
相当于series == other,但支持将fill_value替换为其中一个输入中的缺失数据。
这似乎意味着他们应该一样,因此混乱。
答案 0 :(得分:4)
您遇到的实际上是一种特殊情况,可以更轻松地将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
(,如果您给它一个数组,列表或元组)而不是实际将它与tuple
进行比较。例如,如果你有:
s = pd.Series([1,2,3])
s.eq([1,2,3])
您不希望它将每个元素与[1,2,3]
进行比较。
问题在于object
数组(与dtype=uint
一样)经常滑过裂缝或被故意忽略。该方法中的一个简单if self.dtype != 'object'
分支可以解决此问题。但也许开发人员有充分的理由让这个案例与众不同。我建议通过张贴bug tracker来要求澄清。
你还没有问过如何使它正常工作,但是为了完整性,我将包含一种可能性(根据源代码,你可能需要将它自己包装为pandas.Series
):
>>> s.eq(pd.Series([(1, 2)]))
0 True
1 False
2 False
dtype: bool
答案 1 :(得分:1)
==
是一个逐元素的比较,它产生一个真值的向量,而.eq
是一个"这两个迭代是相等的",其长度相同是一个要求。 Ayhan指出了一个例外:当你使用.eq(scalar value)
比较一个pandas矢量类型时,标量值只是广播到相同大小的矢量进行比较。