【问题标题】:Pandas Float Precision - Apparently Identical Numbers Showing as Not EqualPandas 浮点精度 - 显然相同的数字显示为不相等
【发布时间】:2021-04-17 05:10:48
【问题描述】:

希望有一个非常简单的解决方案。我已经尝试了关于 SO 的两个类似问题的解决方案,但这些对我没有用。

基本上我有一个过程来评估数据帧的两列中的数字是否相等。对于绝大多数人来说,这似乎是正确的。但是,在极少数情况下,看似相等的数字(精确到小数点后 6 位)显示为不相等。

显然,这取决于我的数字的存储方式与我所看到的情况。但奇怪的是,这些数字的数据源只将它们存储为 6dp,并且尝试增加 display.precision 并没有任何效果 - 我仍然只看到 6dp。

a=df[df['Timestamp']=='2018-03-04 22:29:57']['Limit'].copy()

b=df[df['Timestamp']=='2018-03-04 22:29:57']['Quote'].copy()

pd.options.display.precision
Out[152]: 10

a
Out[153]: 
15571027   25.850000
Name: Limit, dtype: float64

b
Out[154]: 
15571027   25.850000
Name: Quote, dtype: float64

a==b
Out[155]: 
15571027    False
dtype: bool

a-b
Out[156]: 
15571027   -0.000000
dtype: float64

b>a
Out[157]: 
15571027    True
dtype: bool

我希望某个善良的灵魂能够建议我可以在这里尝试的下一个逻辑步骤 - 显然 b 大于 a,但是 1)我无法显示这个,并且 2)我最终想创建布尔比较我知道会准确到与我显示的相同的精度。

非常感谢!

【问题讨论】:

  • 尝试将您的数据四舍五入到您显示的精度,如果这适合您的话
  • 是的,这是有道理的。但我真的很想进一步了解我的浮点数是如何存储的,以及为什么布尔比较会在这里产生意想不到的结果。
  • "看似相等的数字" --> 将 float64 打印到 17 个 有效 位以查看它们是否相等。 绝对/固定精度的 6 位肯定不够。

标签: python pandas floating-point boolean


【解决方案1】:

好的,所以我找到了问题的根源。

最初,所有这些数字在流程开始时都与浮点数相同,然后到最后,一些数字以某种方式被更改为浮点数,即使它们的显示方式没有改变。

罪魁祸首是通过 pandas 中的大型 SQLite 操作加入它们 - 尝试合并的数据太多,因此它们被导入为表,根据需要加入,然后作为数据帧写回。尽管没有实际改变任何数字(即通过除法/聚合等),但正是在此过程中,一些浮点数的存储定义被改变了。

感谢 @Artyom Akselrod 的教育 - 通过隐式舍入 SELECT 语句中的输出,这解决了问题。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2015-05-17
    • 2013-11-05
    • 2023-03-19
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多