pandas to_csv参数float_format和decimal不适用于索引列

x7rlezfr  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(131)

我有下面的代码片段将我的数据导出为csv文件:

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

df = pd.DataFrame(get_some_data_from_somwhere(), index=rpm)

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

然而,我希望在索引列上有三个十进制数字和一个逗号作为小数符号,如下所示:

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

因此,在使用.to_csv命令将 Dataframe 导出到csv文件时,似乎没有将indexdecimal符号选项应用于索引列。
既然index选项被设置为True,并且所有值(索引列除外)都具有正确的格式和小数符号,那么我如何才能实现这种行为呢?
我必须以某种方式单独处理索引列吗?

siv3szwd

siv3szwd1#

我会改写你的两条底线:

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将索引放入 Dataframe ,然后告诉to_csv(index=False不要将索引保存到文件中(因为它现在在数据中)。
另外,自己打开文件流(with open('foo.csv', 'w') as f:)最好留给pandas,当你给予它一个字符串'foo.csv'作为第一个参数时,它会自己完成这一任务。

xqk2d5yq

xqk2d5yq2#

在较新版本的pandas中(例如1.5.3),index的格式是float_format沿着列中的值。所以下面的代码正是OP所希望的:

df.to_csv('foo.csv', sep=' ', decimal=',', float_format='%.3f')

如果你来这篇文章寻找一种方法来获得旧的行为(其中索引的格式与列中的值不同),round()可以在转储到csv文件之前使用。

df.round(3).to_csv('foo.csv', sep=' ', decimal=',')

相关问题