float64与pandas to_csv

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.0numpy 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,请参阅格式规范迷你语言.


Ric*_*mes 8

更新:在编写时答案是准确的,浮点精度仍然不是默认情况下你得到的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
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)