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

rya*_*lon 30 python csv floating-point numpy pandas

是否可以为Python pandas包方法pandas.DataFrame.to_csv打印的每个列专门指定一个浮点精度?

背景

如果我有一个pandas如下排列的数据框:

In [53]: df_data[:5]
Out[53]: 
    year  month  day       lats       lons  vals
0   2012      6   16  81.862745 -29.834254   0.0
1   2012      6   16  81.862745 -29.502762   0.1
2   2012      6   16  81.862745 -29.171271   0.0
3   2012      6   16  81.862745 -28.839779   0.2
4   2012      6   16  81.862745 -28.508287   0.0
Run Code Online (Sandbox Code Playgroud)

有一个float_format选项可用于指定精度,但这会在打印时将该精度应用于数据框的所有列.

当我这样使用时:

df_data.to_csv(outfile, index=False,
                   header=False, float_format='%11.6f')
Run Code Online (Sandbox Code Playgroud)

我得到以下内容,其中vals给出了不准确的精度:

2012,6,16,  81.862745, -29.834254,   0.000000
2012,6,16,  81.862745, -29.502762,   0.100000
2012,6,16,  81.862745, -29.171270,   0.000000
2012,6,16,  81.862745, -28.839779,   0.200000
2012,6,16,  81.862745, -28.508287,   0.000000
Run Code Online (Sandbox Code Playgroud)

hkn*_*ust 33

在将数据框导出为CSV文件之前,请更改列"vals"的类型

df_data['vals'] = df_data['vals'].map(lambda x: '%2.1f' % x)

df_data.to_csv(outfile, index=False, header=False, float_format='%11.6f')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您不仅要更改val的类型,还要对其进行舍入.如果修改列是不可接受的,那么在执行to_csv()写入时可以将其保存到临时列'vals.numeric'. (2认同)
  • 为了避免 nan 问题,我的方法是 `lambda x: '%2.1f % x if not pd.isna(x) else ''` (2认同)

Nac*_*cho 10

这个问题有点老了,但我想贡献一个更好的答案,我想是这样的:

formats = {'lats': '{:10.5f}', 'lons': '{:.3E}', 'vals': '{:2.1f}'}

for col, f in formats.items():
    df_data[col] = df_data[col].map(lambda x: f.format(x))
Run Code Online (Sandbox Code Playgroud)

我尝试使用此处的解决方案,但它对我不起作用,我决定尝试使用此处给出的先前解决方案与上面链接中的解决方案相结合。


Pea*_*ful 6

在将数据帧保存到文件之前,您可以对数据帧使用舍入方法。

df_data = df_data.round(6)
df_data.to_csv('myfile.dat')
Run Code Online (Sandbox Code Playgroud)


Mic*_*iak 5

hknust第一行的最新版本是:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1}'.format(x))
Run Code Online (Sandbox Code Playgroud)

要在没有科学符号的情况下进行打印:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1f}'.format(x)) 
Run Code Online (Sandbox Code Playgroud)

  • 这样做的问题是值被更改为字符串 (4认同)