Python Pandas int64数据帧中浮点的成员身份测试产生意外结果

Python Pandas int64数据帧中浮点的成员身份测试产生意外结果,python,numpy,pandas,dataframe,inclusion,Python,Numpy,Pandas,Dataframe,Inclusion,我有一个名为“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) <

我有一个名为“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'>
...
但这里有一个意想不到的结果:我的印象是,
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'>]
[]
下面是一个简单的示例和我正在使用的真实数据文件

这里呢


首先,系列成员资格测试是索引,而不是值:

但你是对的:

>>> 1.5 in s
True
经过一些工作后,这似乎是因为
\uuuu包含
int64哈希表中的\uuuu

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
以浮点形式输入,但我们有

inline khint_t kh_get_int64(kh_int64_t*, int64_t)
因此,我认为在进行比较之前,它被强制为一个整数。

这是。在安全壳测试完成之前,该值被转换为索引类型,因此
62.5
被转换为
62
。(请注意,序列的
中的
检查值是否在索引中,而不是值中。)


我相信你可以通过在impression_数据中执行
62.5来得到你想要的。值

你确定每个值都是整数吗?
impression\u data['site.id'].map(type).unique()提供了什么?你能提供示例代码和数据来说明这个问题吗?谢谢你的快速回复,@BrenBarn。我采纳了您的建议,尝试
impression\u data['site.id'].map(type).unique()
,并编辑了我的问题以反映这一点。下面是示例代码和数据。从历史上看,在
中对numpy数组使用
可能会产生奇怪的结果-我建议使用
np.any(df['site.id'].isin([62.5])
。感谢您指出我在索引@DSM中的错误。这可能会导致很多问题。impression_数据['site.id']中的
62.5。正如您所预测的,值
会产生
False
。一个简单的解决方案@avn2109请注意,在
中对numpy数组使用
并不总是产生所需的结果,尤其是当numpy数组具有多个一维时。“这件事要非常小心。@Ophion:你能说得更具体一点吗?”?在任何情况下,这里我们只使用1D数组(以系列的形式)。
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
inline khint_t kh_get_int64(kh_int64_t*, int64_t)