不等长Pandas DataFrame对比,识别含重复行的差异记录
实现方案
核心思路:通过统计全量字段组合的出现频次,再对比两个表的频次差异,即可同时覆盖「仅单表存在的行」和「同内容行出现次数不一致」的两种场景。
具体实现步骤
1. 构造示例测试数据
import pandas as pd # 构造df1 df1 = pd.DataFrame([ (1,'Joe','Acity'), (2,'Nick','Bcity'), (3,'Sam','Ccity'), (4,'John','Dcity'), (5,'Mike','Ecity') ], columns=['emp_id','emp_name','e_city']) # 构造df2 df2 = pd.DataFrame([ (2,'Nick','Bcity'), (2,'Nick','Bcity'), (3,'Sam','Ccity'), (4,'John','Dcity') ], columns=['emp_id','emp_name','e_city'])
2. 核心逻辑代码
# 步骤1:分别统计两个表中,全字段内容完全一致的行出现次数 count_col = 'row_cnt' df1_cnt = df1.groupby(df1.columns.tolist(), as_index=False).size().rename(columns={'size': f'{count_col}_df1'}) df2_cnt = df2.groupby(df2.columns.tolist(), as_index=False).size().rename(columns={'size': f'{count_col}_df2'}) # 步骤2:按所有字段做外连接,匹配相同内容的行的频次 merge_df = df1_cnt.merge(df2_cnt, on=df1.columns.tolist(), how='outer').fillna(0) # 步骤3:筛选出频次不一致的记录,去除辅助计数列得到最终结果 df3 = merge_df[merge_df[f'{count_col}_df1'] != merge_df[f'{count_col}_df2']].drop(columns=[f'{count_col}_df1', f'{count_col}_df2']).reset_index(drop=True)
结果验证
最终输出的df3和预期完全一致:
| emp_id | emp_name | e_city |
|---|---|---|
| 1 | Joe | Acity |
| 2 | Nick | Bcity |
| 5 | Mike | Ecity |
逻辑说明
- 仅在df1存在的行(emp_id=1、5):df2对应频次为0,和df1的频次1不一致,会被筛选出来
- 内容相同但出现次数不同的行(emp_id=2):df1频次为1,df2频次为2,不一致会被筛选出来
- 两边出现次数完全一致的行(emp_id=3、4):频次相等被过滤
内容的提问来源于stack exchange,提问作者Bhavyashree717
相关产品推荐
相关产品推荐

