如何使用pandas中的to_csv函数进行浮点数格式化?

17

我正在从一个具有8位精度的数据文件中读取数据,然后在进行一些值的插值后,将它们保存下来。但是在保存时,float_format选项没有起作用。

df.to_csv('data.dat',sep=' ', index=False, header=False, float_format="%.8f")

结果文件看起来像

0.02506602 0.05754493 0.36854688
0.02461631 0.0599653 0.43078098
0.02502534 0.06209149 0.44955311
0.4267356675182389 0.1718682822340447 0.5391386354945895
0.426701667727433 0.17191008887193007 0.5391897818631616
0.4266676661681287 0.17195189807522643 0.5392409104354972

前三行是数据文件中的内容,接下来三行是新的插值数值。我希望所有数值长度相同。这里出了什么问题,我该如何修复?

此外:如果我可以针对不同的列控制浮点精度,那就太好了。

1个回答

8

您的代码看起来没问题。很可能是输入数据出了问题。使用 pd.DataFrame.dtypes 来检查所有的输入序列是否为 float 类型。如果不是,请通过以下方式转换为 float 类型:

df[col_list] = df[col_list].apply(pd.to_numeric, downcast='float').fillna(0)

以下是一个可行的示例:
from io import StringIO
import pandas as pd

mystr = StringIO("""0.02506602 0.05754493 0.36854688
0.02461631 0.0599653 0.43078098
0.02502534 0.06209149 0.44955311
0.4267356675182389 0.1718682822340447 0.5391386354945895
0.426701667727433 0.17191008887193007 0.5391897818631616
0.4266676661681287 0.17195189807522643 0.5392409104354972""")

df = pd.read_csv(mystr, delim_whitespace=True, header=None)

print(df.dtypes)

# 0    float64
# 1    float64
# 2    float64
# dtype: object

file_loc = r'C:\temp\test.dat'
df.to_csv(file_loc, sep=' ', index=False, header=False, float_format="%.8f")

df = pd.read_csv(file_loc, delim_whitespace=True, header=None)

print(df[0].iloc[-1])

# 0.42666767

@Eular,是的,可能就是这样。不确定为什么要将空字符串添加到数字数据中。改用np.nan,你可能会更加幸运。 - jpp
在某些地方打印一个空行并不是一件简单(且低效)的事情。我强烈建议不要这样做。我认为你可能需要提供一个最小可复现示例。因为(正如你从我的示例中看到的那样),重现你的问题并不是一件直截了当的事情。 - jpp
1
好的,float_format现在可以工作了。谢谢。你能将第一列的精度设置为2点,后面两列的精度设置为8点吗? - Eular
@Eular,我不确定使用to_csv是否可能。您可能希望发起一个新的问题。 - jpp
好的,我有一个整数列,我想将其写成整数,但是当我使用 np.nan 时,我无法保持该列为整数。这就是为什么我正在尝试为不同的列使用不同的精度格式。此外,如果我使用 round(),那么一些打印会以科学计数法 e 表示,我也不想要那样。因此,我的最佳选择是使用 round() 而不引入 e 表示法。 - Eular
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接