2014-01-26 47 views
0

我有一個數據幀大熊貓,取名爲「impression_data」,其中包括一個名爲列「site.id,」像這樣:成員測試產生意想不到的結果

>>> impression_data['site.id'] 

0  62 
1  189 
2  191 
3  62 
... 

圖中的每個項目列具有數據類型numpy.int64,像這樣:

>>> for i in impression_data['site.id']: 
    print type(i) 

<type 'numpy.int64'> 
<type 'numpy.int64'> 
<type 'numpy.int64'> 
... 

和預期的一樣,會員測試效果很好,只要我測試整數:

>>> 62 in impression_data['site.id'] 
True 

但是,這是意想不到的結果:我的印象是np.int64的列不應包含任何十進制值。顯然我錯了。這裏發生了什麼?

>>> 62.5 in impression_data['site.id'] 
True 

編輯1: 列中的所有值應該是由建設整數。爲了完整起見,我還進行了以下澆鑄操作和遇到的任何錯誤:

impression_data['site.id'] = impression_data['site.id'].astype('int') 

按@ BremBam的建議的意見,我想

impression_data['site.id'].map(type).unique() 

產生

[<type 'numpy.int64'>] 

一個最小的例子和我正在使用的真實數據文件在這裏 https://dl.dropboxusercontent.com/u/28347262/SE%20Pandas%20Int64%20Membership%20Testing/cm_impression.csv

這裏

https://dl.dropboxusercontent.com/u/28347262/SE%20Pandas%20Int64%20Membership%20Testing/ExampleCode.py

+0

你確定每個值都是int嗎? 'impression_data ['site.id']。map(type).unique()'給了什麼?你能否提供演示問題的示例代碼和數據? – BrenBarn

+0

感謝您的快速回復,@BrenBarn。我接受了關於嘗試'impression_data ['site.id']。map(type).unique()'的建議'並編輯了我的問題以反映這一點。示例代碼和數據即將推出。 – avn2109

+0

歷史上使用'in'作爲numpy數組可能會產生奇怪的結果 - 我會建議類似'np.any(df ['site.id']。isin([62.5]))''。 – Daniel

回答

1

這是a bug in pandas。在包含測試完成之前將該值轉換爲索引類型,因此62.5轉換爲62。 (注意:in了一系列的檢查值是否在指數,而不是值)。

我相信你可以通過做62.5 in impression_data.values得到你想要的東西。

+0

'impression_data ['site.id']。中的62.5會產生'False',就像您預測的那樣。一個簡單的修復! – avn2109

+0

@ avn2109請注意,在numpy數組中使用'in'並不總是產生所需的結果,特別是當numpy數組有多個維時。對此非常小心。 – Daniel

+0

@Ophion:你能更具體嗎?無論如何,這裏我們只使用一維數組(以一個Series的形式)。 – BrenBarn

0

首先,在系列成員資格測試是指數的,而不是

>>> s = pd.Series([10,20,30]) 
>>> s 
0 10 
1 20 
2 30 
dtype: int64 
>>> 0 in s 
True 
>>> 10 in s 
False 

但你是對的:

>>> 1.5 in s 
True 

經過一番工作,這看到MS是__contains__Int64HashTable因爲:

cdef class Int64HashTable: #(HashTable): 
    [...] 
    def __contains__(self, object key): 
     cdef khiter_t k 
     k = kh_get_int64(self.table, key) 
     return k != self.table.n_buckets 

key進來的浮動,但我們有

inline khint_t kh_get_int64(kh_int64_t*, int64_t) 

,所以我認爲這是強制轉換爲整數作出比較之前。

+0

感謝您使用索引@DSM指出我的錯誤。這可能會導致很多問題。 – avn2109

相關問題