web-dev-qa-db-ja.com

pandas.DataFrame.to_csv()で列ごとに異なる精度を出力しますか?

質問

Python pandas packageメソッド pandas.DataFrame.to_csv ?によって印刷される各列に特に浮動小数点精度を指定することは可能ですか?

バックグラウンド

次のように配置されたpandasデータフレームがある場合:

In [53]: df_data[:5]
Out[53]: 
    year  month  day       lats       lons  vals
0   2012      6   16  81.862745 -29.834254   0.0
1   2012      6   16  81.862745 -29.502762   0.1
2   2012      6   16  81.862745 -29.171271   0.0
3   2012      6   16  81.862745 -28.839779   0.2
4   2012      6   16  81.862745 -28.508287   0.0

そこには float_formatオプションを使用して精度を指定できますが、印刷時にデータフレームのすべての列にその精度が適用されます。

私はそれを次のように使用するとき:

df_data.to_csv(outfile, index=False,
                   header=False, float_format='%11.6f')

valsに不正確な精度が指定されている場合、次のようになります。

2012,6,16,  81.862745, -29.834254,   0.000000
2012,6,16,  81.862745, -29.502762,   0.100000
2012,6,16,  81.862745, -29.171270,   0.000000
2012,6,16,  81.862745, -28.839779,   0.200000
2012,6,16,  81.862745, -28.508287,   0.000000
29
ryanjdillon

これは to_stringformatters引数があり、列名の辞書をフォーマッタに提供できます。次に、いくつかの正規表現を使用して、デフォルトの列区切り文字を選択した区切り文字に置き換えることができます。

3
mattexx

データフレームをCSVファイルにエクスポートする前に、列「vals」のタイプを変更します

df_data['vals'] = df_data['vals'].map(lambda x: '%2.1f' % x)

df_data.to_csv(outfile, index=False, header=False, float_format='%11.6f')
32
hknust

Hknustの最初の行の最新バージョンは次のとおりです。

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1}'.format(x))

科学表記なしで印刷するには:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1f}'.format(x)) 
5

データフレームをファイルに保存する前に、データフレームに round メソッドを使用できます。

df_data = df_data.round(6)
df_data.to_csv('myfile.dat')
4
Peaceful

to_string @mattexxによって提案されたアプローチは、データフレームを変更しないので、私にはより良く見えます。

jupyterノートブックを使用して、きれいなHTML出力を取得する場合は、to_html 方法。ここで、新しいデフォルトの精度4を設定し、それをオーバーライドして、特定の列widerの5桁を取得します。

from IPython.display import HTML
from IPython.display import display

pd.set_option('precision', 4)

display(HTML(df.to_html(formatters={'wider': '{:,.5f}'.format})))
2
nealmcb