2017-06-06 68 views
3

這可能很基本,但爲什麼看起來像in不適用於包含對象或字符串的Series爲什麼在系列包含字符串時不能`in`搜索值

>>> import pandas as pd 

>>> s = pd.Series(['a', 'b', 'c']) 
>>> 'a' in s 
False 
>>> 'a' in s.astype('S1') 
False 

Series.__contains__文檔是相當稀少:

[In 1]: s.__contains__? 
Signature: s.__contains__(key) 
Docstring: True if the key is in the info axis 
File:  c:\...\lib\site-packages\pandas\core\generic.py 
Type:  method 

我的第一個念頭是in只檢查了 「指標」:

>>> 1 in s 
True 

但後來:爲什麼它(似乎)使用其他類型:

>>> 1.2 in pd.Series([1.3, 1.2]) 
True 

>>> 1 in pd.Series([1.3, 1.2]) # also works for index 
True 

我對工作解決方案不感興趣。我知道我可以簡單地使用whatever in s.valuesnp.any(s.eq(whatever))。我想知道爲什麼它的行爲方式(或者我錯過了什麼?)。

回答

3

它的行爲方式是因爲Series更像OrderedDict而不是列表。

就像1 in {0: 5, 1: 10}爲真,1 in pd.Series([5, 10])也是如此,因爲索引是RangeIndex(start=0, stop=2, step=1),索引元素就像鍵。

我看到爲什麼

>>> 1.2 in pd.Series([1.3, 1.2]) 
True 

的情況下可能會有點混亂,但它只是根據你所選擇的數字巧合 - 1.2與任何比較之前強制轉換爲一個int RangeIndex或Int64Index,所以你真的要求1 in ser.index。就我個人而言,我不喜歡這種行爲,但這就是它所做的。

>>> 1.9 in pd.Series([1.3, 1.2]) 
True 
>>> 1.2 in pd.Series([1.3, 1.2], index=[10, 20]) 
False 

爲了使強制更加明顯:

In [54]: np.inf in pd.Series([1.3, 1.2]) 
--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 
<ipython-input-54-b069ecc5baf6> in <module>() 
----> 1 np.inf in pd.Series([1.3, 1.2]) 

[...] 
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.__contains__ (pandas/_libs/index.c:3924)() 

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.__contains__ (pandas/_libs/hashtable.c:13569)() 

OverflowError: cannot convert float infinity to integer 
相關問題