【发布时间】:2018-07-10 20:23:15
【问题描述】:
前言
我先说两件事:
- 我是 python/pandas 的新手,我尽量不重新发明轮子
- 我已阅读pandas.to_numeric 的文档
- 我读过Why Are Floating Point Numbers Inaccurate? 和Why can't decimal numbers be represented exactly in binary?。我了解我们在这里使用的概念,并试图找出一个“好的”解决方案来获得一点点精确度
- 我知道确保用户只输入数字会更容易,但我无法控制源数据;该程序是一个大规模的数据验证工具,无论提供什么,它都必须接受用户的所有内容
背景
我正在将一个项目从 R 移植到 python,并且正在努力寻找一种翻译文本到浮点转换过程的好方法。具体来说,我是:
- 从 SQL 数据库 (pandas.read_sql) 中读取 pandas 数据帧
- 使用 pd_to_numeric 将存储为文本的列转换回数字
- 使用
error='coerce'选项强制从文本强制转换为浮点数 - 检查之前/之后以查看输入是否/在何处被强制为 NaN
- 使用
问题
如何让 pandas 巧妙地将浮点值的文本表示强制转换为相应的浮点数?
我遇到的问题是数值精度。例如:
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
这是我想要的行为。这可能使用熊猫/python吗?我愿意合并其他软件包,或者被告知“这是不可能的”。
【问题讨论】:
-
更长的答案:是的。确保您使用的是 NumPy >= 1.14.0。您在此处看到的输出数字是 NumPy
float64实例,并且 NumPy 1.14.0 更改了浮点打印功能,以便您可以更频繁地看到简洁的表示。 -
谢谢@MarkDickinson!这正是我一直在寻找/希望的。我真的很感激。
-
@cᴏʟᴅsᴘᴇᴇᴅ:我认为副本不太合适
-
@MarkDickinson 重新打开,我的错误。欢迎回答。
标签: python r pandas numpy floating-point