【问题标题】:Issue with pandas dataframe compare using datacompy library使用 datacompy 库比较 pandas 数据框的问题
【发布时间】:2021-06-30 14:07:00
【问题描述】:

我正在尝试使用 datacompy 包比较两个数据帧。 我看到了一些奇怪的东西。

print(dfA)
          req_nbr          unit_cost_amt
0        24468868            1.36870
1        24468868            1.36870
2        24468868            1.64952
3        24468868            1.64952
4        24468868            0.83289
5        24468868            0.83289
6        24468868            0.83289
7        24468868            0.83289

然后我有另一个具有相同数据和结构的数据框。

print(dfB)

          req_nbr          unit_cost_amt
0        24468868            1.36870
1        24468868            1.36870
2        24468868            1.64952
3        24468868            1.64952
4        24468868            0.83289
5        24468868            0.83289
6        24468868            0.83289
7        24468868            0.83289

两个数据帧相同且数据类型相同。

dfA['unit_cost_amt'].dtype
dtype('float64')

dfB['unit_cost_amt'].dtype
dtype('float64')

现在我正在使用 datacompy 进行比较

        compare = datacompy.Compare(
                                dfA,
                                dfB,

                                # You can also specify a list of columns
                                join_columns = ['req_nbr'], 

                                # Optional, defaults to 0
                                abs_tol = 0,

                                # Optional, defaults to 0
                                rel_tol = 0, 

                                # Optional, defaults to 'df1'
                                df1_name = 'Old',

                                # Optional, defaults to 'df2'
                                df2_name = 'New' 
                                )
    print(compare.report())

它显示了差异......

DataComPy Comparison
--------------------

DataFrame Summary
-----------------

  DataFrame  Columns  Rows
0       Old        2     8
1       New        2     8

Column Summary
--------------

Number of columns in common: 2
Number of columns in Old but not in New: 0
Number of columns in New but not in Old: 0

Row Summary
-----------

Matched on: req_nbr
Any duplicates on match values: Yes
Absolute Tolerance: 0
Relative Tolerance: 0
Number of rows in common: 8
Number of rows in Old but not in New: 0
Number of rows in New but not in Old: 0

Number of rows with some compared columns unequal: 4
Number of rows with all compared columns equal: 4

Column Comparison
-----------------

Number of columns compared with some values unequal: 1
Number of columns compared with all values equal: 1
Total number of values which compare unequal: 4

Columns with Unequal Values or Types
------------------------------------

          Column Old dtype New dtype  # Unequal      Max Diff  # Null Diff
    0  unit_cost_amt   float64   float64          4  1.110223e-16            0

Sample Rows with Unequal Values
-------------------------------

          req_nbr             unit_cost_amt (Old)       unit_cost_amt (New)
6        24468868                  0.83289                  0.83289
7        24468868                  0.83289                  0.83289
4        24468868                  0.83289                  0.83289
5        24468868                  0.83289                  0.83289

知道我在这里做错了什么吗? 令人费解。

【问题讨论】:

    标签: python pandas compare


    【解决方案1】:

    1e-16 处的最大差异表明它是a difference in the last mantissa bit, or some rounding / cancellation issue like that。这取决于差异的计算方式(如果数字完全相同,则不应该发生这种情况)。

    您应该设置 rel_tolabs_tol 以避免此类问题 - 这就是这些参数的用途。

    例如,datacompy.Compare(..., rel_tol=1e-10) 表示* 如果 abs(a / b - 1) 小于 10^-10,数字 ab 将被视为相同。这个相对阈值足够大,绝不会意外发生,对于大多数应用程序来说足够小。

    您可以选择适合您的任何阈值。由于您所有的unit_cost_amt 似乎都有 5 位数字,因此您也可以使用 abs_tol=1e-6

    * 通常是这样定义的,但我实际上并没有阅读 datacompy 文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多