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


背景

我正在做一些模拟。通过变量参数进行系统分析(在这种情况下) rpm 只)并附加结果数据帧的最后一行 results_df 总结数据框架 df 包含给予我的系统的baviour依赖于变化 rpm

为了获得适当的绘图和数据分析索引,我转换了不同的值(这里 rpm)从列表到熊猫系列 ser 并结合本系列总结数据框 df 包含我感兴趣的结果。

由于我感兴趣的每个计算的结果只是每个计算的最后一行,我从结果数据帧中提取这些数据 results_df 通过使用 .tail(1)

到目前为止我所做的工作如下所示:

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

所以似乎是 index 和 decimal 使用时将数据帧导出到csv文件时,符号选项不会应用于索引列 .to_csv 命令。

我怎么能实现这种行为 index 选项已设置 True 并且所有值(索引列除外)都具有正确的格式和小数符号?

我是否必须以某种方式单独处理索引列?


8180
2017-07-23 11:34


起源

解决方法是做 data.reset_index().to_csv(index=False ... - firelynx
此外,你可以做到 data.to_csv('foo.csv'......你不需要给它一个流。 - firelynx
@firelynx:导出数据后文件是否自动关闭?这在某种程度上是相关的,因为几个月前我超过了打开文件的最大数量... - albert
是的,它会自动关闭文件。我认为让pandas处理文件处理通常更安全,因为那时逻辑保存在一个地方,而不是在你做的所有地方 .to_csv - firelynx
把我的两点写成一个正确的答案,而不是更详细一点。 - firelynx


答案:


我会重写你的两个底线:

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= 只能工作 数据 列,而不是索引。

我所做的是将索引放入数据框中 reset_index 然后我告诉 to_csv(index=False 不要将索引保存到文件中(因为它现在在数据中)。

此外,自己打开文件流(with open('foo.csv', 'w') as f:最好留给熊猫,当你给它一个字符串时它会自己做 'foo.csv' 作为第一个论点。


16
2017-07-23 12:05