按共有唯一键对比两个DataFrame,定位不同行对应的差异列
解决方案
你可以先按唯一键A合并两个表,再逐行对比对应字段的差异即可,完整实现代码如下:
import pandas as pd # 示例数据构造 df1 = pd.DataFrame({ 'A': ['V', 'W', 'X', 'Y', 'Z'], 'B': [10,9,8,7,6], 'C': [5,18,7,9,5], 'D': [18,11,12,7,3], 'E': [20,13,5,8,90] }) df2 = pd.DataFrame({ 'A': ['V', 'W', 'X', 'Y', 'Z'], 'B': [30,9,8,36,6], 'C': [5,18,7,9,5], 'D': [18,11,12,7,3], 'E': [20,9,5,8,90] }) # 1. 按唯一键A合并两个表,用后缀区分两个表的同名字段 merged_df = df1.merge(df2, on='A', suffixes=('_left', '_right')) # 2. 定义需要对比的字段(排除唯一键A) compare_columns = [col for col in df1.columns if col != 'A'] # 3. 定义逐行找差异字段的函数 def find_diff_columns(row): diff_cols = [] for col in compare_columns: if row[f"{col}_left"] != row[f"{col}_right"]: diff_cols.append(col) # 存在多列差异时用逗号拼接,可根据需求调整返回格式 return ','.join(diff_cols) if diff_cols else None # 4. 计算差异字段,过滤无差异的行得到最终结果 merged_df['key'] = merged_df.apply(find_diff_columns, axis=1) df3 = merged_df[merged_df['key'].notnull()][['A', 'key']].reset_index(drop=True) print(df3)
运行后输出结果和你预期一致:
A key 0 V B 1 W E 2 Y B
说明
如果你的场景中允许同一行出现多列差异,上面的代码会自动把所有差异列名拼接返回,无需修改逻辑;如果只需要判断是否存在差异,也可以直接调整返回值为布尔类型即可。
内容的提问来源于stack exchange,提问作者Hamouza
相关产品推荐
相关产品推荐

