2012-11-25 60 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