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