2016-01-07 49 views
5

pandas.DataFrameに格納されたデータを、各列が別のデータ型(整数または浮動小数点)を持つことができるバイト文字列に変換する必要があります。ここでは、データの簡単なセットされていますpandas.DataFrameをバイトに変換する

df = pd.DataFrame([ 10, 15, 20], dtype='u1', columns=['a']) 
df['b'] = np.array([np.iinfo('u8').max, 230498234019, 32094812309], dtype='u8') 
df['c'] = np.array([1.324e10, 3.14159, 234.1341], dtype='f8') 

とDFがこのようなものになります。

a   b     c 
0 10 18446744073709551615 1.324000e+10 
1 15 230498234019   3.141590e+00 
2 20 32094812309    2.341341e+02 

DataFrameので、私はこのような何かをしたいのですが、各列df.dtypesの種類を知っています:

data_to_pack = [tuple(record) for _, record in df.iterrows()] 
data_array = np.array(data_to_pack, dtype=zip(df.columns, df.dtypes)) 
data_bytes = data_array.tostring() 

これは、典型的に起因df['b'][0]に格納されている最大値(この場合は正常に動作しなく。の配列を変換し、上記第二の行を単一のデータタイプ(float64デフォルト)とSeriesとしてレコードを抽出する最初の行に

OverflowError: Python int too large to convert to C long 

エラー結果(私は信じる):タイプの所与のセットでnp.arrayにタプル次のエラーが発生最大uint64値のfloat64で選択された表現は、uint64に直接変換することはできません。

1)DataFrameはすでに各列の型が分かっているので、型付きのnumpy.arrayコンストラクタに入力するためのタプルの行を作成する方法がありますか?あるいは、このような変換で型情報を保持するために、上に概説したよりも良い方法がありますか?

2)DataFrameから、各列の型情報を使用してデータを表すバイト文字列に直接移動する方法がありますか。

答えて

2

あなたはバイトの文字列にこれを変換する.tostring()を呼び出し、その後、numpyのrecarrayにあなたのデータフレームに変換するdf.to_records()を使用することができます。

rec = df.to_records(index=False) 

print(repr(rec)) 
# rec.array([(10, 18446744073709551615, 13240000000.0), (15, 230498234019, 3.14159), 
# (20, 32094812309, 234.1341)], 
#   dtype=[('a', '|u1'), ('b', '<u8'), ('c', '<f8')]) 

s = rec.tostring() 
rec2 = np.fromstring(s, rec.dtype) 

print(np.all(rec2 == rec)) 
# True 
関連する問題