gpt4 book ai didi

python - Pandas to_numeric 数值精度

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:05 30 4
gpt4 key购买 nike

前言

我先说两件事:

背景

我正在努力将一个项目从 R 移植到 python,并且正在努力寻找一种转换文本到 float 转换过程的好方法。具体来说,我是:

  • 从 SQL 数据库中读取 pandas 数据框 (pandas.read_sql)
  • 使用 pd_to_numeric 将存储为文本的列转换回数字
    • 使用 error='coerce' 选项强制从文本强制转换为 float
    • 检查之前/之后以查看输入是否/在哪里被强制为 NaN

问题

如何让 pandas 将浮点值的文本表示干净利落地转换为相应的 float ?

我遇到的问题是数值精度。例如:

In[1]: pd.to_numeric('3.785', errors='coerce')
Out[2]: 3.7850000000000001

我明白为什么会这样(即 3.785 的表示方式不容易在底层二进制表示中表示)。我想弄清楚的是,是否有一种方法可以解决它高效发生的原因。

例如,在 R 中,幕后发生了很多事情,但在 as.numeric API 中,您得到的数字表面上由文本值表示:

> as.numeric('3.785')
[1] 3.785

这是我想要的行为。这可能使用 Pandas / python 吗?我愿意合并其他软件包,或者被告知“那是不可能的”。

最佳答案

我不确定您是在问更多关于精度还是精度显示(格式)的问题,但希望这个答案能解决这两个问题。

在幕后,r 和 pandas 可能在做完全相同的事情,但默认显示让它看起来不同。例如,如果您想更好地了解 r 如何存储数字,您可以这样做:

> sprintf( "%.20f", as.numeric('3.785') )
[1] "3.78500000000000014211"

当然,一旦您超过了小数点后第 14 位左右,您就超出了 double float 中可以存储的内容,这些数字实际上没有意义。尽管如此,这至少应该足以表明 r 并没有真正将其存储为完全 3.785

诚然,有比某处更严格的答案,但实际上“忽略小数点后第 13 位或第 14 位的任何内容”对于标准数据工作几乎总是足够的(而且你几乎肯定最好花钱你的时间在别处,而不是担心小数点后第 14 位)。

我不能确切地说出为什么你使用的 pandas 函数显示 3.7850000000000001 而不是 3.785 但一般来说你可以在不同的部分获得不同级别的默认显示精度numpy 和 Pandas 。例如,如果您只是将 [] 放在您的数字周围(以传递列表而不是标量),pd.to_numeric 将具有输出一个 numpy 数组,并显示更少的小数位:

In [61]: pd.to_numeric(['3.785'], errors='coerce')
Out[61]: array([ 3.785])

如果您传递的是系列而不是列表,您也会得到类似的显示输出。如果您想要特定级别的显示精度,只需明确指定即可:

In [62]: pd.to_numeric(pd.Series(['3.785']), errors='coerce').map('{:,.20f}'.format)
Out[62]:
0 3.78500000000000014211

因此,当您明确显示 20 位小数时,您会在 r 和 pandas/numpy 中看到相同的数字表示。

也许值得一提的是 python 确实提供了一个 Decimal type它具有精确的小数点(不同于单精度或 double float ),但很少将其用于数据科学或数值应用,因为它不是原生的 pandas 类型,而且性能通常会很差。我相信它主要用于会计应用程序。

关于python - Pandas to_numeric 数值精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48547017/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com