我正在阅读带有这样的浮点数的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 。
答案 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_csv
和the 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文件,您将获得这些整数数字。然后将这些值转换为浮点值,除以之前乘以的相同因子。