将DataFrame转换为列表时,浮点精度会受到影响

时间:2015-08-12 23:53:47

标签: python csv pandas dataframe floating-point-precision

所以我尝试使用row.values.tolist()(从{CSV}文件读取row)将float DataFrame转换为列表(列表)。它的工作相当不错,但是对于一些值,精度受到影响,例如,而不是32.337它输出32.336999999999996.

由于tolist()会产生列表,我需要使用列表,我决定切换到list(row.values.flatten()),但它会介绍列表中几乎任何值的精度问题,这只是最糟糕的。

我差不多3年前找到了关于这个问题的discussion on Github,但我发现其他任何事情都没有更新,我不知道如何克服这个问题。

我尝试使用pd.set_option('display.precision',4)因为对于大多数值我最多需要四位有效数字,但这也不起作用(假设我正确使用它)。

有没有解决方法呢?

3 个答案:

答案 0 :(得分:2)

但是,根据基本值,您可能仍然会遇到精度问题。  您仍然可以使用round指定希望使用的小数位数。

df = pd.DataFrame([(.2132481, .399452), (.012311, .13267), (.613216, .01233), (.213211, .181235)])
df.values.round(3).tolist()

>> [[0.213, 0.399], [0.012, 0.133], [0.613, 0.012], [0.213, 0.181]]

3中的.round(3)保留了三个小数位。

答案 1 :(得分:1)

您所看到的“精度损失”是由于二进制浮点不能精确表示小数分数,因此存在一些舍入误差。如果你真的想要通过未更改的方式传递十进制值,那么使用实际的十进制表示会得到更好的结果...

不幸的是,NumPy似乎没有提供任何十进制数据类型供您使用。

答案 2 :(得分:0)

正如Padraic所提到的,您没有使用display.precision修改正确的选项。相反,尝试:

pd.options.display.float_format = '{:,.3f}'.format