【问题标题】:Floating point precision affected when converting DataFrame to list将 DataFrame 转换为列表时浮点精度受到影响
【发布时间】:2019-12-09 01:35:46
【问题描述】:

所以我试图通过使用row.values.tolist()row 是从 CSV 文件中读取的)将浮点 DataFrame 转换为(列表)列表。它的工作还不错,尽管对于一些值,精度会受到影响,因此,例如,输出 32.337 而不是 32.336999999999996.

由于tolist() 产生一个列表列表,并且我需要使用列表,因此我决定切换到list(row.values.flatten()),但它几乎引入了精度问题列表中的任何值,这只会使其变得最糟糕。

我发现了一个关于这个问题的discussion on Github,从大约 3 年前开始,但我找不到任何最新的东西,我不知道如何克服这个问题。

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

有什么解决方法吗?

【问题讨论】:

  • 视觉表现如何影响您的应用程序?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案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]]
    

    .round(3) 中的 3 表示三位小数。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-02-03
        • 2011-11-17
        • 2015-06-12
        • 2013-04-16
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        相关资源
        最近更新 更多