python - 使用 datacompy 库比较 pandas 数据框的问题
问题描述
我正在尝试使用 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
知道我在这里做错了什么吗?令人费解。
解决方案
1e-16 处的最大差异表明它是最后一个尾数位的差异,或者类似的舍入/取消问题。这可能取决于如何计算差异(如果数字完全相同,则不应该发生这种情况)。
您应该设置rel_tol
或abs_tol
避免此类问题 - 这就是这些参数的用途。
例如,datacompy.Compare(..., rel_tol=1e-10)
表示*该数字a
,如果小于,b
则将被视为相同。这个相对阈值足够大,不会偶然发生,对于大多数应用程序来说足够小。abs(a / b - 1)
10^-10
您可以选择适合您的任何阈值。由于您unit_cost_amt
似乎都有 5 位数字,因此您也可以使用abs_tol=1e-6
.
* 它通常是这样定义的,但我实际上并没有阅读 datacompy 文档
推荐阅读
- kubernetes - 根据网络请求运行 Kubernetes 作业(也称为基于套接字的激活)
- android - React Native 添加 Picker 数组
- java - 提高/降低性能的 Cicles 方面
- python - PyQt5标签被切断
- informatica - 我想存储第一条记录的列值并将该值与其余记录进行比较
- c# - .net 核心找不到“JavaScriptSerializer”
- javascript - 在 Web 服务器上显示 txt 文件的内容
- javascript - 创建鼠标选择框
- java - 调试和运行 JavaFx Eclipse 项目时找不到 Java 类
- php - Swiftmailer 电子邮件大小