You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不等长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_idemp_namee_city
1JoeAcity
2NickBcity
5MikeEcity

逻辑说明

  • 仅在df1存在的行(emp_id=1、5):df2对应频次为0,和df1的频次1不一致,会被筛选出来
  • 内容相同但出现次数不同的行(emp_id=2):df1频次为1,df2频次为2,不一致会被筛选出来
  • 两边出现次数完全一致的行(emp_id=3、4):频次相等被过滤

内容的提问来源于stack exchange,提问作者Bhavyashree717

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:57:03