0

我有一个名为“impression_data”的 Pandas 数据框,其中包含一个名为“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's 列不应该包含任何十进制值。显然我错了。这里发生了什么?

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

4

2 回答 2

1

这是pandas 中的一个错误。在包含测试完成之前,该值被转换为索引的类型,因此62.5被转换为62. (请注意,in对于系列检查值是否在索引中,而不是值。)

我相信你可以通过做得到你想要的62.5 in impression_data.values

于 2014-01-26T19:38:33.237 回答
0

首先, Series 中的成员资格测试是index,而不是values

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

经过一些工作,这似乎是因为__contains__in 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)

所以我认为在进行比较之前它被强制转换为整数。

于 2014-01-26T19:34:26.677 回答