ava*_*123 67 python numpy pandas
我正在读取带有这样的浮点数的CSV:
Bob,0.085
Alice,0.005
Run Code Online (Sandbox Code Playgroud)
并导入到数据框中,并将此数据框写入新位置
df = pd.read_csv(orig)
df.to_csv(pandasfile)
Run Code Online (Sandbox Code Playgroud)
现在这pandasfile有:
Bob,0.085000000000000006
Alice,0.0050000000000000001
Run Code Online (Sandbox Code Playgroud)
发生什么事?也许我必须转换为不同的类型,如float32或其他什么?
我使用pandas 0.9.0和numpy 1.6.2.
bmu*_*bmu 122
正如评论中所提到的,这是一个普遍的浮点问题.
但是,您可以使用float_format关键字to_csv隐藏它:
df.to_csv('pandasfile.csv', float_format='%.3f')
Run Code Online (Sandbox Code Playgroud)
或者,如果您不希望将0.0001舍入为零:
df.to_csv('pandasfile.csv', float_format='%g')
Run Code Online (Sandbox Code Playgroud)
会给你:
Bob,0.085
Alice,0.005
Run Code Online (Sandbox Code Playgroud)
在您的输出文件中.
有关说明%g,请参阅格式规范迷你语言.
更新:在编写时答案是准确的,浮点精度仍然不是默认情况下你得到的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
Run Code Online (Sandbox Code Playgroud)
显示"问题"的经典单行是......
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
......没有像人们期望的那样显示0.3.另一方面,如果使用定点算法处理计算,并且仅在最后一步中使用浮点运算,它将按预期工作.看到这个:
>>> (1 + 1 + 1) * 1.0 / 10
0.3
Run Code Online (Sandbox Code Playgroud)
如果你迫切需要规避这个问题,我建议你创建另一个CSV文件,其中包含所有数字作为整数,例如乘以100,1000或其他因素,结果很方便.在您的应用程序中,像往常一样阅读CSV文件,您将获得这些整数数字.然后将这些值转换为浮点,除以之前乘以的相同因子.
小智 5
我遇到了这个问题,这是我找到的解决方案。(我尝试了其他解决方案,但它无法正常工作。)
首先,尝试四舍五入到所需的小数,然后导出到 csv。
只需尝试以下操作:
df = df.astype(float).round(3)
df.to_csv('pandasfile.csv')
Run Code Online (Sandbox Code Playgroud)