web-dev-qa-db-ja.com

pandas to_csv引数float_formatおよび10進数がインデックス列で機能しない

バックグラウンド

私はそれぞれのシミュレーションを行っています。さまざまなパラメーター(この場合はrpmのみ)によるシステム分析と、結果データフレームresults_dfのすべての最終行を、システムの動作を提供する要約データフレームdfに追加します。さまざまなrpmの依存度。

プロットとデータ分析に適切なインデックスを取得するために、リストのさまざまな値(ここではrpm)をpandas series ser and concatに変換しました関心のある結果を含む要約データフレームdfを含むこのシリーズ。

関心のある各計算の結果は各計算の最後の行のみであるため、.tail(1)を使用して結果データフレームresults_dfからこのデータを抽出しています。

これまでに行ったことは、次のスニペットに示されています。

rpm = [0.25, 0.3, 0.5, 0.75, 1.0, 1.5, 2.0]

ser = pd.Series(rpm, name='rpm')
df = pd.DataFrame()
df_list = list()

for i, val in enumerate(rpm):
    results_df = get_some_data_from_somwhere()
    df_list.append(results_df.tail(1))

df = df.append(df_list, ignore_index=True)
df = pd.concat([df, ser], axis=1)
df.set_index('rpm', inplace=True)


with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')

問題

私が得るこのcsvファイルは次の形式を持っています:

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0.25 303,317 323,372 302,384 324,332

ただし、次のように、インデックス列に3桁の10進数と小数点記号としてコンマがあると予想しました。

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0,250 303,317 323,372 302,384 324,332

したがって、.to_csvコマンドを使用してデータフレームをcsvファイルにエクスポートする場合、indexおよびdecimal符号オプションはインデックス列に適用されないようです。

indexオプションがTrueに設定され、すべての値(インデックス列を除く)が正しい形式と小数点記号を持っているため、この動作をどのように実現できますか?

インデックス列を何らかの方法で処理する必要がありますか?

17
albert

私はあなたの2つのボトムラインを書き直します:

_with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')
_

_data.reset_index().to_csv('foo.csv', index=False, header=True, decimal=',', sep=' ', float_format='%.3f')
_

これは少しの回避策ですが、お気づきのとおり、キーワード引数_decimal=_および_float_format=_は、インデックスではなくdata列でのみ機能します。

代わりに、_reset_index_を使用してインデックスをデータフレームに配置し、_to_csv(index=False_に、ファイルにインデックスを保存しないように指示します(データに含まれているため)。

また、ファイルストリーム(with open('foo.csv', 'w') as f:)を自分で開くことは、パンダに任せた方が良いです。これは、最初の引数として文字列_'foo.csv'_を指定するだけでこれを行います。

20
firelynx