5

Pandas データフレームに長整数を挿入しようとしています

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 スコア
0 6311132704823138710 273
1 2685045978526272070 23
2 8921811264899370420 45
3 -1427056828720020936 270
4 -8516636646409950606 273

uid は 64 ビットの unsigned int であるため、「u8」が正しい dtype である必要があります。何か案は ?

4

2 に答える 2

3

はい、これは pandas の現在の制限です。将来、符号なし整数 dtype のサポートを追加する予定です。エラーメッセージははるかに優れています:

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

今のところ、回避策として列を作成できますdtype=object

編集 2012-11-27

現在、オーバーフローを検出していますが、DataFrame が符号なしデータ型をより適切にサポートするまでは、dtype=object になります。

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
于 2012-11-25T18:16:52.707 に答える
0

これは、64 ビット コンピューターで試すか、pandas 開発者に連絡する (または自分で問題にパッチを当てる) ことを除いて、何をすべきかを教えてくれません。しかし、とにかく、これはあなたの問題のようです:

問題はDataFrame、少なくとも 32 ビット マシンでは unsigned int 64 ビットを理解できないことです。

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)

dtypeofDataFrameが行 94 で要求されたものと一致しないことに注意してください。また、上記のコメントで書いたように、numpy 配列は完全に機能します。さらに、uint32行 94 で指定すると、値dtypeに ofが指定されます。ただし、おそらくの正の値内に収まるため、負のオーバーフローは発生しません。int64DataFrameuint32int64

于 2012-11-25T14:57:37.567 に答える