2016-04-18 35 views
7

私はCSVデータを取り込み、pandas to_dict関数をJSONにデータを変換する最終目標に向けたステップの1つとして使用しています。問題は、数値を変更することです(1.6は1.6000000000000001になります)。私は正確さの喪失を心配していませんが、ユーザーは数値の変化を見るので、素人です。番号を変更するパンダto_dict

これはhereより前に出てきましたが、2年前のことですが、本当にうまく答えられていないことがわかりました。私は辞書に変換するデータフレームデータ型を自由に組み合わせることができます。以前のソリューションと、このような問題としては、次のとおりです。

  1. は、オブジェクトへのすべての数字を変換するとだけあなたは数字を使用する必要がない場合は動作します - 私はまた、小数の問題を再導入合計値や平均値を計算するためのオプションをしたいです
  2. Xの小数点以下に数字の丸めフォースは、精度が低下したり、データに応じて、ユーザーが

を提供し、追加の不要な0を追加するかだから、ハイレベルで、私の質問は:

がありますより良い方法数値が変更されていないことを確認しますが、数値データ型に保持されていますか?それは最初にCSVデータをインポートする方法を変更することですか?確かに私は見落としている簡単な解決策がありますか?ここで

は、このバグを再現する簡単なスクリプトです:

import pandas as pd 

import sys 
if sys.version_info[0] < 3: 
    from StringIO import StringIO 
else: 
    from io import StringIO 

CSV_Data = "Index,Column_1,Column_2,Column_3,Column_4,Column_5,Column_6,Column_7,Column_8\nindex_1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\nindex_2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8\nindex_3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8\nindex_4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8" 

input_data = StringIO(CSV_Data) 
df = pd.DataFrame.from_csv(path = input_data, header = 0, sep=',', index_col=0, encoding='utf-8') 
print(df.to_dict(orient = 'records')) 
+1

を使用JSON、に再帰的に任意のオブジェクトを変換しますか? – Zero

+0

@JohnGalt基本的には、列の動的ネストを可能にするために、to_dictを使用して作成した辞書は、ビルド中の大きな辞書に挿入され、最終的にJSONにダンプされます。 –

+0

あなたは 'pd.io.json.dumps(nested_dicts_with_pd_objects)'を使うことができます、それはあなたのために働くのですか?理想的には、丸めシナリオを導入するべきではありません。 – Zero

答えて

2

あなたはパンダのオブジェクトと、ネストされたdictsを処理するためにpd.io.json.dumpsを使用することができます。

summary dictをデータフレームレコードとカスタムメトリックで作成しましょう。

In [137]: summary = {'df': df.to_dict(orient = 'records'), 'df_metric': df.sum()/df.min()} 

In [138]: summary['df_metric'] 
Out[138]: 
Column_1 9.454545 
Column_2 9.000000 
Column_3 8.615385 
Column_4 8.285714 
Column_5 8.000000 
Column_6 7.750000 
Column_7 7.529412 
Column_8 7.333333 
dtype: float64 

In [139]: pd.io.json.dumps(summary) 
Out[139]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":{"Column_1":9.4545454545,"Column_2":9.0,"Column_3":8.6153846154,"Column_4":8.2857142857,"Column_5":8.0,"Column_6":7.75,"Column_7":7.5294117647,"Column_8":7.3333333333}}' 

使用、double_precision倍の最大桁の精度を変更します。 通知。 df_metric値。

In [140]: pd.io.json.dumps(summary, double_precision=2) 
Out[140]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":{"Column_1":9.45,"Column_2":9.0,"Column_3":8.62,"Column_4":8.29,"Column_5":8.0,"Column_6":7.75,"Column_7":7.53,"Column_8":7.33}}' 

あなたは、データフレームを処理するためにorient='records/index/..'を使用することができます - > to_jsonを建設します。

要するに
In [144]: pd.io.json.dumps(summary, orient='records') 
Out[144]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":[9.4545454545,9.0,8.6153846154,8.2857142857,8.0,7.75,7.5294117647,7.3333333333]}' 

pd.io.json.dumpsは - エンド目的は、JSONを使用する場合、 `df.to_json(オリエント= 'レコード')`を使用しないのはなぜ内部ultrajson

関連する問題