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

时间:2013-11-15 14:26:21

标签: python csv numpy floating-point 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

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

当我这样使用时:

df_data.to_csv(outfile, index=False,
                   header=False, float_format='%11.6f')

我得到以下内容,其中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

6 个答案:

答案 0 :(得分:32)

在将数据框导出为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')

答案 1 :(得分:4)

更多当前版本的hknust的第一行将是:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1}'.format(x))

在没有科学记数法的情况下进行打印:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1f}'.format(x)) 

答案 2 :(得分:3)

在将数据帧保存到文件之前,您可以使用round方法处理数据帧。

df_data = df_data.round(6)
df_data.to_csv('myfile.dat')

答案 3 :(得分:2)

您可以使用to_string执行此操作。有一个formatters参数,您可以在其中为格式化程序提供列名称的​​字典。然后,您可以使用一些正则表达式将默认列分隔符替换为您选择的分隔符。

答案 4 :(得分:1)

@mattexx建议的to_string方法看起来更好,因为它不会修改数据帧。

使用jupyter笔记本通过to_html方法获得漂亮的HTML输出时,它也可以很好地概括。这里我们设置一个新的默认精度为4,并覆盖它以获得特定列wider的5位数:

from IPython.display import HTML
from IPython.display import display

pd.set_option('precision', 4)

display(HTML(df.to_html(formatters={'wider': '{:,.5f}'.format})))

答案 5 :(得分:1)

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

az ad sp create-for-rbac --name ServicePrincipalName --create-cert

我尝试使用解决方案here,但对我而言不起作用,我决定尝试结合此处提供的先前解决方案和上面的链接进行尝试。