我正在读取带有如下浮动数字的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。
我正在读取带有如下浮动数字的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。
Answers:
如评论中所述,这是一个一般的浮点问题。
但是,您可以使用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'
pandas到较新的版本。
更新:在撰写本文时,答案是准确的,并且默认情况下to_csv / read_csv仍无法获得浮点精度(精度与性能之间的权衡;默认情况下,性能更佳)。
目前有中float_format可用的参数pandas.DataFrame.to_csv和该float_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文件,您将获得这些整数。然后将这些值转换为浮点数,然后除以之前乘以的相同因子。