pandas to_csv参数float_format和十进制不适用于索引列

alb*_*ert 17 python csv indexing decimal-point pandas

背景

我正在做一些模拟.通过变量参数(rpm仅在这种情况下)进行系统分析,并将结果数据帧的每一个最后一行附加results_df到一个汇总数据帧,该数据帧df包含了对我的系统的baviour依赖于变化rpm.

为了获得适当的绘图和数据分析索引,我将列表中的各种值(此处rpm)转换为pandas系列,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')
Run Code Online (Sandbox Code Playgroud)

问题

我得到的这个csv文件有以下格式:

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0.25 303,317 323,372 302,384 324,332
Run Code Online (Sandbox Code Playgroud)

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

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0,250 303,317 323,372 302,384 324,332
Run Code Online (Sandbox Code Playgroud)

因此,使用该命令将数据帧导出到csv-files时,似乎并未将" index和" decimal选项应用于索引列.to_csv.

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

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

fir*_*ynx 20

我会重写你的两个底线:

with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')
Run Code Online (Sandbox Code Playgroud)

data.reset_index().to_csv('foo.csv', index=False, header=True, decimal=',', sep=' ', float_format='%.3f')
Run Code Online (Sandbox Code Playgroud)

这是一个有点一种解决办法,但你已经注意到,关键字参数decimal=,并float_format=只对工作数据列,而不是指数.

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

另外,打开一个文件流own(with open('foo.csv', 'w') as f:)最好留给pandas,当你只给它一个字符串'foo.csv'作为第一个参数时,它自己这样做.