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

Posted

技术标签:

【中文标题】pandas to_csv 参数 float_format 和 decimal 不适用于索引列【英文标题】:pandas to_csv arguments float_format and decimal not working for index column 【发布时间】:2015-10-13 16:30:34 【问题描述】:

背景

我正在做一些模拟。通过改变参数进行系统分析(在这种情况下仅限rpm)并将结果数据帧results_df 的每一行附加到汇总数据帧df 中,其中包含根据不同rpm 给出我的系统的baviour。

为了获得用于绘图和数据分析的适当索引,我将列表中的不同值(此处为 rpm)转换为 pandas 系列 ser 并将该系列与包含结果的汇总数据框 df 连接我有兴趣。

由于我感兴趣的每个计算的结果只是每个计算的最后一行,因此我使用.tail(1) 从结果数据框results_df 中提取此数据。

到目前为止我所做的显示在以下sn-p中:

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 文件时,indexdecimal 符号选项似乎未应用于索引列。

由于index 选项设置为True 并且所有值(索引列除外)都具有正确的格式和小数点符号,我该如何实现此行为?

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

【问题讨论】:

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

我会重写你的两条底线:

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' 作为第一个参数时,它自己会这样做。

【讨论】:

以上是关于pandas to_csv 参数 float_format 和 decimal 不适用于索引列的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头pandas使用to_csv函数将dataframe保存为gzip压缩文件

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

使用 pandas.DataFrame.to_csv() 按列输出不同的精度?

Pandas - 使用 to_csv 编写多索引行

AttributeError:模块“pandas”没有属性“to_csv”

pandas:dataframe to_csv,如何设置列名