2014-01-26 43 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

相关问题