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

问题描述 投票:0回答:2

背景

我正在做一些模拟。通过改变参数(在这种情况下仅

rpm
)进行系统分析,并将结果数据框
results_df
的每一行附加到总结数据框
df
,其中包含给出我的系统对不同
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
命令将数据帧导出到 csv 文件时,
decimal
.to_csv
符号选项似乎未应用于索引列。

自从设置了

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

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

python csv pandas indexing decimal-point
2个回答
35
投票

我会改写你的两条底线:

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


2
投票

在较新版本的 pandas(例如 1.5.3)中,索引的格式为

float_format
以及列中的值。因此,以下内容正是 OP 所希望的:

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

如果你来到这篇文章是为了寻找一种方法来获得旧的行为(其中索引的格式与列中的值不同),

round()
可以在转储到 csv 文件之前使用。

df.round(3).to_csv('foo.csv', sep=' ', decimal=',')
© www.soinside.com 2019 - 2024. All rights reserved.