所以我尝试使用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)
因为对于大多数值我最多需要四位有效数字,但这也不起作用(假设我正确使用它)。
有没有解决方法呢?
答案 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