web-dev-qa-db-ja.com

Pandas float値を含むcsvファイルを読み取ると、奇妙な丸めと10進数になる

1524.449677などの数値を含むcsvファイルがあります。小数点は常に正確に6桁です。

pandas read_csv]を介してcsvファイル(および他の列)をインポートすると、列は自動的にデータ型objectを取得します。私の問題は、値が2470.6911370000003実際には2470.691137である必要があります。または、値2484.306912484.3069100000002と表示されます。

これは何らかの形でデータ型の問題のようです。 dtype引数をread_csvとして指定することにより、{'columnname': np.float64}を介してインポートするときにデータ型を明示的に指定しようとしました。それでも問題は消えませんでした。

インポートした値をソースのcsvファイルとまったく同じように取得するにはどうすればよいですか?

13
beta

パンダは専用のdec 2 bin速度よりも精度を犠牲にするコンバーター。

合格float_precision='round_trip'からread_csvこれを修正します。

詳細は このページ をご覧ください。

データを処理した後、csvファイルに保存して戻す場合は、
float_format = "%.nf"を対応するメソッドに追加します。

完全な例:

import pandas as pd

df_in  = pd.read_csv(source_file, float_precision='round_trip')
df_out = ... # some processing of df_in
df_out.to_csv(target_file, float_format="%.3f") # for 3 decimal places
13

私はこれが古い質問であることを理解していますが、多分これは他の誰かを助けるでしょう:

同様の問題がありましたが、同じ解決策を使用できませんでした。残念ながら、_float_precision_オプションはCエンジンを使用する場合にのみ存在し、pythonエンジンを使用しない場合に存在します。したがって、python engine forその他の理由(たとえば、Cエンジンが正規表現リテラルを区切り文字として処理できないため)、この小さな「トリック」が私にとってうまくいきました:

_pd.read_csv_引数で_dtype='str'_を定義し、データフレームを任意のdtypeに変換します。 df = df.astype('float64')

ちょっとしたハックですが、うまくいくようです。誰かがこれをより良い方法で解決する方法について何か提案があれば、私に知らせてください。

2
Holzner