2016-12-31 66 views
7

考慮一系列s爲什麼大熊貓 '==' 不同於 '.EQ()'

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說?

相當於系列==其他,但與支持代替一個fill_value在其中的一個輸入缺失數據。

這似乎意味着他們應該工作相同,因此混亂。

+0

@piRSquared:現在你已經在帖子中增加了一些研究成果的證據!起初你只是說過你已經假定了X事物並將它留在那個 –

回答

3

您遇到的情況實際上是一種特殊情況,它可以比較pandas.Seriesnumpy.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因爲熊貓承擔.eq,你想轉換爲而不是(如果你給它一個數組,列表或元組numpy.ndarraypandas.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上來要求澄清。


你還沒有問你如何使它正常工作,但completness我會包括一個可能性(根據源代碼,它很可能你需要用它作爲自己pandas.Series):

>>> s.eq(pd.Series([(1, 2)])) 
0  True 
1 False 
2 False 
dtype: bool 
0

==是一個元素明智的比較,產生一個真值的向量,而.eq是一個「那兩個迭代是相等的」,對於它來說,長度相同是需求。 Ayhan指出了一個例外:當您使用.eq(scalar value)比較熊貓矢量類型時,標量值只是廣播到相同大小的矢量進行比較。

+1

它實際上使用了一個標量進行廣播:例如's.eq(3)'。 – ayhan