118

我正在阅读一个带有浮点数的 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.0numpy 1.6.2

4

2 回答 2

201

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

但是,您可以使用float_format关键字 ofto_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

于 2012-10-14T12:58:04.093 回答
16

更新:在撰写本文时答案是准确的,并且浮点精度仍然不是您默认使用 to_csv/read_csv 获得的(精度-性能权衡;默认值有利于性能)。

现在有可用于float_formatpandas.DataFrame.to_csv论据和可用于float_precision论据pandas.from_csv

原著仍然值得阅读,以更好地理解这个问题。


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

于 2013-05-08T14:11:08.017 回答