Python pandas插入长整数

时间:2012-11-25 12:19:50

标签: python numpy pandas

我正在尝试在Pandas Dataframe中插入长整数

import numpy as np
from pandas import DataFrame

data_scores = [(6311132704823138710, 273), (2685045978526272070, 23), (8921811264899370420, 45), (17019687244989530680L, 270), (9930107427299601010L, 273)]
dtype = [('uid', 'u8'), ('score', 'u8')]
data = np.zeros((len(data_scores),),dtype=dtype)
data[:] = data_scores
df_crawls = DataFrame(data)
print df_crawls.head()

但是当我查看数据框时,最后的长值现在是负数:

                       uid  score
0  6311132704823138710    273
1  2685045978526272070     23
2  8921811264899370420     45
3 -1427056828720020936    270
4 -8516636646409950606    273

uids是64位unsigned int,所以'u8'应该是正确的dtype?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

是 - 这是熊猫目前的限制 - 我们计划在将来添加对无符号整数dtypes的支持。错误消息会更好:

http://github.com/pydata/pandas/issues/2355

现在,您可以将列dtype=object作为解决方法。

编辑2012-11-27

现在检测溢出,但现在变为dtype = object,直到DataFrame更好地支持无符号数据类型。

In [3]: df_crawls
Out[3]: 
                    uid  score
0   6311132704823138710    273
1   2685045978526272070     23
2   8921811264899370420     45
3  17019687244989530680    270
4   9930107427299601010    273

In [4]: df_crawls.dtypes
Out[4]: 
uid      object
score     int64

答案 1 :(得分:0)

这不会告诉你该做什么,除了尝试使用64位计算机或联系pandas开发人员(或自己修补问题......)。但无论如何,这似乎是你的问题:

问题是DataFrame无法理解无符号int 64位,至少在32位机器上是这样。

我更改了data_score的值,以便更好地跟踪发生的情况:

data_scores = [(2**31 + 1, 273), (2 ** 31 - 1, 23), (2 ** 32 + 1, 45), (2 ** 63 - 1, 270), (2 ** 63 + 1, 273)]

然后我尝试了:

In [92]: data.dtype
Out[92]: dtype([('uid', '<u8'), ('score', '<u8')])

In [93]: data
Out[93]: 
array([(2147483649L, 273L), (2147483647L, 23L), (4294967297L, 45L),
       (9223372036854775807L, 270L), (9223372036854775809L, 273L)], 
      dtype=[('uid', '<u8'), ('score', '<u8')])

In [94]: df = DataFrame(data, dtype='uint64')

In [95]: df.values
Out[95]: 
array([[2147483649,                  273],
       [2147483647,                   23],
       [4294967297,                   45],
       [9223372036854775807,                  270],
       [-9223372036854775807,                  273]], dtype=int64)

注意dtype的{​​{1}}如何与第94行中请求的DataFrame不匹配。另外,正如我在上面的评论中写的那样,numpy数组工作得很好。此外,如果您在第94行中指定uint32,则仍会为dtype值指定int64 DataFrame。但是,它不会给你带来负面溢出,可能是因为uint32符合int64的正值。