带熊猫的float64 to_csv


88

我正在读取带有如下浮动数字的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


26
欢迎使用浮点数。
伊格纳西奥·巴斯克斯


1
我创建了一个要在此处进行更详细研究的问题:github.com/pydata/pandas/issues/2069编辑:如果可以,请在GitHub问题上单独复制该问题。我无法复制它。
Wes McKinney 2012年

Answers:


165

如评论中所述,这是一个一般的浮点问题。

但是,您可以使用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,请参见格式规范迷你语言


我遇到了一个错误TypeError: __init__() got an unexpected keyword argument 'float_format'
wander95

如果某人的错误与@ wander95相同,则可能需要更新pandas到较新的版本。
漂流守望者'18

10

更新:在撰写本文时,答案是准确的,并且默认情况下to_csv / read_csv仍无法获得浮点精度(精度与性能之间的权衡;默认情况下,性能更佳)。

目前有float_format可用的参数pandas.DataFrame.to_csvfloat_precision可供说法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文件,您将获得这些整数。然后将这些值转换为浮点数,然后除以之前乘以的相同因子。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.