Float64加上熊猫 to_csv

我看到一个 CSV 上面有这样的浮动数字:

Bob,0.085
Alice,0.005

然后导入到一个数据框中,并将这个数据框写入到一个新的位置

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

现在这个 pandasfile有:

Bob,0.085000000000000006
Alice,0.0050000000000000001

发生了什么? 也许我必须转换到不同的类型,比如 float32或者别的什么?

进口使用 熊猫0.9麻木的1.6。2

121331 次浏览

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

但是你可以使用 to_csvfloat_format关键字来隐藏它:

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的说明,请参见 格式规格小型语言

更新: 在编写本文时,答案是准确的,并且在默认情况下,使用 to _ csv/read _ csv (精度-性能折衷; 默认情况下有利于性能)仍然不能获得浮点精度。

现在有 可用于 ABC1的 float_format参数可用于 ABC3的 float_precision参数

为了更好地理解这个问题,原文仍然值得一读。


这在熊猫中是一个错误,不仅在“ 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 文件,您将得到这些整数数字。然后将这些值转换为浮点数,除以之前乘以的相同因子。

我遇到了这个问题,这就是我找到的解决办法。 (我尝试了另一种解决方案,但它不能正常工作。)

首先,尝试四舍五入到所需的小数,然后导出到 csv。

试试以下方法:

df = df.astype(float).round(3)
df.to_csv('pandasfile.csv')