2012-11-25 58 views
4

我试图插入长整数的熊猫数据帧Python的大熊猫插入长整型

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 

uid是64位无符号整型,所以'u8'应该是正确的dtype?有任何想法吗 ?

+0

似乎溢出。如何尝试“更大”的数据类型? – goFrendiAsgard

+0

与u16:类型错误:数据类型不理解 – Tom

+0

你的np数据看起来很好,并且错误表明熊猫错过了'u'并给你一个有符号的long而不是unsigned。 – deinonychusaur

回答

0

这不会告诉你该做什么,除非尝试在64位计算机上或联系熊猫开发者(或自己修补问题...)。但无论如何,这似乎是你的问题:

问题是,DataFrame不理解unsigned 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) 

通知DataFramedtype如何不匹配一个在第94行中请求。同样如我在上面的评论中所写的,numpy数组完美工作。此外,如果您在第94行中指定了uint32,则它仍然指定值为的int64。但它不会给你负溢出,可能是因为uint32适合在int64的正值内。

+0

我个人认为这是应该报告的熊猫中的一个错误。大熊猫在做numpy这样不安全的演员时应该至少发出警告,并且在使用不同类型时会出现错误,然后明确要求... – seberg

+0

我同意它会更好,它也值得注意,它在实际上会为您的数据创建一个新副本,因此如果数组很大,则会使用两倍的内存...... – deinonychusaur

1

是的 - 这是熊猫目前的限制 - 我们计划在将来添加对无符号整数dtype的支持。一个错误信息会好得多:

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

现在你可以作为一种变通列dtype=object

编辑2012年11月27日

检测溢出现在,虽然将成为D型=对象现在到数据帧具有无符号的数据类型提供更好的支持。

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