熊猫转为数字的数值精度

2024-10-16 20:53:14 发布

您现在位置:Python中文网/ 问答频道 /正文

前言

我先说两件事:

  • 我是python/pandas的新手,我不想重新发明轮子
  • 我已经阅读了pandas.to_numeric的文档
  • 我读过Why Are Floating Point Numbers Inaccurate?和{a3}。我理解我们在这里工作的概念,并试图找出一个“好的”解决方案来获得一点点的精确性
  • 我知道确保用户只输入数字会更容易,但我无法控制源数据;该程序是一个大规模的数据验证工具,它必须接受来自用户的所有信息,无论提供了什么

背景

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

  • 从SQL数据库中读取熊猫数据帧(pandas.read_sql)在
  • 将存储为文本的列转换为数字,使用pd_to_numeric
    • 使用error='coerce'选项强制将文本强制转换为浮点
    • 检查before/after以查看是否/在何处将输入强制为NaN

问题

如何让pandas简洁地将浮点值的文本表示强制转换为相应的浮点值?

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

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

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

例如,在R中,引擎盖下有很多事情发生,但是as.数字API,您将得到表面上由文本值表示的数字:

^{pr2}$

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


Tags: to数据方法用户文本pandas情况数字
1条回答
网友
1楼 · 发布于 2024-10-16 20:53:14

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

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

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

当然,一旦你超过了小数点后14位左右,你就超过了可以存储在双精度浮点中的数值,而这些数字并没有真正意义。不过,这至少应该足以证明r并没有真正地将其存储为确切地3.785。在

诚然,有一个比这更为严格的答案,但作为一个实际问题,“忽略任何超过小数点后13或14的东西”对于标准数据工作来说几乎总是足够的(而且几乎可以肯定的是,你最好把时间花在其他地方,而不是担心小数点后14位)。在

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

^{pr2}$

如果传递的是序列而不是列表,也会得到类似的显示输出。如果需要特定级别的显示精度,只需显式指定:

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,它具有精确的小数(不同于单精度或双精度浮点),但很少将其用于数据科学或数值应用,因为它不是原生的pandas类型,性能通常会很差。我相信它主要是为了会计应用。在

相关问题 更多 >