float64与pandas to_csv

时间:2012-10-13 21:31:34

标签: python numpy pandas

我正在阅读带有这样的浮点数的CSV:

Bob,0.085
Alice,0.005

导入数据框,并将此数据框写入新的地方

df = pd.read_csv(orig)
df.to_csv(pandasfile)

现在这个pandasfile有:

Bob,0.085000000000000006
Alice,0.0050000000000000001

会发生什么?也许我必须转换为不同的类型,如float32或其他什么?

我使用 pandas 0.9.0 numpy 1.6.2

2 个答案:

答案 0 :(得分:100)

正如评论中所提到的,这是一个普遍的浮点问题。

但是,您可以使用float_format关键字to_csv来隐藏它:

df.to_csv('pandasfile.csv', float_format='%.3f')

或者,如果您不希望将0.0001舍入为零:

df.to_csv('pandasfile.csv', float_format='%g')

会给你:

Bob,0.085
Alice,0.005
输出文件中的

有关%g的说明,请参阅Format Specification Mini-Language

答案 1 :(得分:6)

更新:在编写时答案是准确的,浮点精度仍然不是默认情况下使用to_csv / read_csv得到的(精确性能权衡;默认情况下有利于性能)。

现在有the float_format argument available for pandas.DataFrame.to_csvthe float_precision argument available for pandas.from_csv

原版仍然值得一读,以便更好地掌握这个问题。


这是熊猫中的一个错误,不仅在“to_csv”函数中,而且在“read_csv”中也是如此。这不是一般的浮点问题,尽管浮点运算是一个需要程序员注意的主题。下面的这篇文章澄清了这个主题:

http://docs.python.org/2/tutorial/floatingpoint.html

显示“问题”的经典单行是......

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

...没有像人们期望的那样显示0.3。另一方面,如果使用定点算术处理计算,并且仅在最后一步中使用浮点算术,它将按预期工作。见:

>>> (1 + 1 + 1)  * 1.0 / 10
0.3

如果您迫切需要规避此问题,我建议您创建另一个CSV文件,其中包含所有数字作为整数,例如乘以100,1000或其他因素,结果很方便。在您的应用程序中,像往常一样阅读CSV文件,您将获得这些整数数字。然后将这些值转换为浮点值,除以之前乘以的相同因子。