2017-07-12 31 views
1

私はpandas DataFrameを1つの辞書が1行を表す辞書のリストに変換しようとしています。従ってパンダto_dict(orient='records')方法は完璧です;ただし出力が誤って四捨五入されることがあります。ここでは例です:pandas:to_dict( "records")が正しく丸められていません

df = pd.DataFrame({'x': [1/3, 2/3], y=[4/3, 5/3]}) 
#   x   y 
    0 0.333333 1.333333 
    1 0.666667 1.666667 

df.round(3).to_dict(orient='records') # rounded incorrectly 
# [{'x': 0.3330000000000002, 'y': 1.333}, {'x': 0.6670000000000004, 'y': 1.667}] 

df.round(3).to_dict(orient='list') # rounded correctly 
# {'x': [0.333, 0.667], 'y': [1.333, 1.667]} 

あなたはto_dict(orient='list')が正常に動作するようです見ることができるように。ここで何が問題なの?

+0

についていくつかの詳細情報については

0.18.1には、両方のために同じようだあなたは、よろしいですか? – Zero

+0

私は0.20.2を使用しています –

答えて

2

何らかの理由でpandas 0.20.2では、orient = recordsはnumpy float型を使用し、orient = listはネイティブpython float型を使用します。

records = df.round(3).to_dict(orient='records') 
print(type(records[0]['x'])) 
numpy.float64 

list_orient=df.round(3).to_dict(orient='list') 
print(type(list_orient['x'][0])) 
float 

正確なデータ型の違いは、丸めの違いになります。 なぜ異なるorient引数が異なるデータ型になるのか、私は言うことができません。

バックネイティブのpythonフロートにnumpyのフロート変換する場合:

print(float(records[0]['x'])) 
0.333 

を我々はリスト指向to_records出力のような出力が得られます。奇妙なフロートペテンIs floating point math broken?

+0

これは '0.20.2'のためだけですか?最新のバージョンにアップグレードするとこれが修正されますか? –

+0

最新バージョンにアップグレードするとこれが解決するかどうかはわかりません。ジョンは0.18.1でこの行動をしなかったので、私は0.20.2で明示した。 – error

関連する問題