首先,Python datacompy是一个Python库,可以用于比较两个Pandas数据框架(DataFrames)。该应用程序比较不同数据框架中列的值和缺少的行。
下面是使用Python datacompy库执行数据框架比较的详细步骤。
安装Python datacompy
在开始之前,我们需要先安装Python datacompy库。可以使用以下命令在命令行中进行安装:
pip install datacompy
导入Python datacompy
安装了Python datacompy后,下一步就是将它导入我们的Python应用程序中。可以使用以下命令导入Python datacompy库:
import datacompy
加载数据框架
在Python中,数据框架可以使用Pandas库加载。例如,以下代码加载了名为df1和df2的两个数据框架:
import pandas as pd
df1 = pd.read_csv('file1.csv')
df2 = pd.read_csv('file2.csv')
数据框架比较
有了两个数据框架和Python datacompy库,我们就可以开始比较数据框架了。以下代码比较了df1和df2数据框架之间的差异:
compare = datacompy.Compare(
df1,
df2,
join_columns='id', # 指定join的列
abs_tol=0.0001, # 绝对容差值(absolute_tolerance),默认为0
rel_tol=0.0001, # 相对容差(percentage_tolerance或relative_tolerance),默认为0
df1_name='Original', # 第一个DataFrame的名称
df2_name='New' # 第二个DataFrame的名称
)
print(compare.report())
以上代码指定了一个join列“id”,用于连接两个数据框架。它还使用了绝对和相对容差值来确定两个值是否相等。
最后,compare.report()
方法可打印两个数据框之间的差异。输出结果将提供详细的列比较、缺失值和非零计数。
以下是一个示例输出结果:
DataComPy Comparison
--------------------
DataFrame Summary
-----------------
DataFrame Columns Rows
0 Original 4 100
1 New 4 105
Column Summary
--------------
Number of columns in common: 4
Number of columns in Original but not in New: 0
Number of columns in New but not in Original: 0
Row Summary
-----------
Matched on: id
Any duplicates on match column: No
Absolute Tolerance: 0.0001
Relative Tolerance: 0.0001
Number of rows in common: 98
Number of rows in Original but not in New: 2
Number of rows in New but not in Original: 7
Column Comparison
--------------
Column Comparison: id
Approximately 0.00% | 0 Values in Original but not in New
Approximately 0.00% | 0 Values in New but not in Original
Mismatched Values: 2
Column Comparison: name
Approximately 1.00% | 1 Values in Original but not in New
Approximately 0.00% | 0 Values in New but not in Original
Mismatched Values: 1
Column Comparison: age
Approximately 0.00% | 0 Values in Original but not in New
Approximately 3.81% | 4 Values in New but not in Original
Mismatched Values: 4
Column Comparison: gender
Approximately 0.00% | 0 Values in Original but not in New
Approximately 0.00% | 0 Values in New but not in Original
Mismatched Values: 0
在上面的示例中,可以看到有2行在原始数据框架中但不在新数据框架中,并且有7个行在新数据框架中但不在原始数据框架中。还可以看到,在“name”列和“age”列中有一些不同的值。
我们还可以将比较结果保存到一个新的数据框中。以下示例将比较结果存储在名为“df_diff”的新数据框中:
df_diff = compare.highlight_diffs()
highlight_diffs()
方法返回一个包含两个数据框架之间差异的新数据框架。
如果想将特定的差异指定为过滤条件,则需要将highlight_diffs()
方法与filter()
方法一起使用。以下是一个示例:
diff_filter = datacompy.filters.ReplaceSubstringFilter(column='name', substr='Tom', match_entire=False) #只比较`name`列中不包括Tom的情况
df_diff_filtered = compare.highlight_diffs().filter(diff_filter)
示例 1
假设我们有以下两个数据框架:
DataFrame A:
id | name | age
----|---------|----
1 | Tom | 20
2 | Sarah | 25
3 | Rick | 30
DataFrame B:
id | name | age
----|---------|----
1 | Tom | 20
2 | Sarah | 26
3 | Rick | 35
4 | John | 40
我们想比较这两个数据框架中的数据,并找出它们之间的差异。
请使用以下代码比较两个数据框,并将差异保存到名为“df_diff”的新数据框中:
import pandas as pd
import datacompy
df_A = pd.DataFrame({
'id': [1, 2, 3],
'name': ['Tom', 'Sarah', 'Rick'],
'age': [20, 25, 30]
})
df_B = pd.DataFrame({
'id': [1, 2, 3, 4],
'name': ['Tom', 'Sarah', 'Rick', 'John'],
'age': [20, 26, 35, 40]
})
compare = datacompy.Compare(
df_A,
df_B,
join_columns='id',
abs_tol=0.0001,
rel_tol=0.0001,
df1_name='Original',
df2_name='New'
)
df_diff = compare.highlight_diffs()
最后,输出差异的内容:
print(df_diff)
输出结果如下:
_merge id name_left name_right age_left age_right
2 right_only 4 NaN John NaN 40.0
8 column_mismatch NaN NaN Rick NaN 35.0
9 both 2 Sarah Sarah 25.0 26.0
10 column_mismatch NaN NaN Tom NaN 20.0
在这个例子中,我们可以看到比较结果的每一行,以及左右两个数据框中各个数据列之间的差异。输出中包含了如下四种情况:
- “_merge”列包含了左右数据框的状态:仅在左边出现、仅在右边出现、都出现等。
- “id”列包含了匹配两个数据框其中一列的值。
- “name_left”列包含了左边的数据框,而“name_right”则包含了右边的数据框。
- “age_left”列包含了左边的数据框,而“age_right”则包含了右边的数据框。
示例 2
假设我们有以下两个数据框架:
DataFrame A:
id | name | age
----|---------|----
1 | Tom | 20
2 | Sarah | 25
3 | Rick | 30
DataFrame B:
id | name | age
----|---------|----
1 | Tom | 20
2 | Sarah | 26
3 | Rick | 35
4 | John | 40
我们想比较这两个数据框架,并只查看“age”列中的差异。
下面的代码将按以下方式完成:
import pandas as pd
import datacompy
df_A = pd.DataFrame({
'id': [1, 2, 3],
'name': ['Tom', 'Sarah', 'Rick'],
'age': [20, 25, 30]
})
df_B = pd.DataFrame({
'id': [1, 2, 3, 4],
'name': ['Tom', 'Sarah', 'Rick', 'John'],
'age': [20, 26, 35, 40]
})
compare = datacompy.Compare(
df_A,
df_B,
join_columns='id',
abs_tol=0.0001,
rel_tol=0.0001,
df1_name='Original',
df2_name='New'
)
diff_filter = datacompy.filters.NumericToleranceFilter(column='age', abs_tol=5, rel_tol=0) # 只比较绝对容差为5的情况
df_diff = compare.highlight_diffs().filter(diff_filter)
该示例中,NumericToleranceFilter()
方法允许我们仅比较“age”列中绝对容差值为5的数据差异。在结果中,只有值“25”与“26”被视为差异。
输出结果如下:
_merge id name_left name_right age_left age_right
8 both 2 Sarah Sarah 25 26
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python datacompy 找出两个DataFrames不同的地方 - Python技术站