pandas to_csv 参数 float_format 和小数不适用于索引列
pandas to_csv arguments float_format and decimal not working for index column
背景
我正在做一些模拟。通过改变参数进行系统分析(在本例中仅 rpm
)并将结果数据框的每一行最后一行附加到总结数据框 df
中,其中包含给出我系统依赖于的行为变化多样 rpm
.
为了获得用于绘图和数据分析的适当索引,我将列表中的不同值(此处 rpm
)转换为 pandas 系列 ser
并连接该系列摘要数据框 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
但是,我希望索引列中有三个小数位和一个逗号作为小数点符号,如下所示:
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
并且所有值(索引列除外)都具有正确的格式和小数点符号,因此我如何实现此行为?
我是否必须以某种方式单独处理索引列?
我会改写你的两条底线:
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:
) 最好留给 pandas,当您只给它一个字符串 'foo.csv'
作为第一个参数时,它会自动执行此操作。
背景
我正在做一些模拟。通过改变参数进行系统分析(在本例中仅 rpm
)并将结果数据框的每一行最后一行附加到总结数据框 df
中,其中包含给出我系统依赖于的行为变化多样 rpm
.
为了获得用于绘图和数据分析的适当索引,我将列表中的不同值(此处 rpm
)转换为 pandas 系列 ser
并连接该系列摘要数据框 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
但是,我希望索引列中有三个小数位和一个逗号作为小数点符号,如下所示:
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
并且所有值(索引列除外)都具有正确的格式和小数点符号,因此我如何实现此行为?
我是否必须以某种方式单独处理索引列?
我会改写你的两条底线:
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:
) 最好留给 pandas,当您只给它一个字符串 'foo.csv'
作为第一个参数时,它会自动执行此操作。