如何基于ID与指定列从两个DataFrame生成含不匹配列的新DataFrame
对比两个DataFrame并生成值不匹配结果表
需求说明
实现一个函数,输入两个DataFrame,基于first_column作为唯一ID标识,找出两表中指定列的不匹配值,输出包含这些不匹配信息的新DataFrame。
输入示例数据
import pandas as pd data1 = { 'first_column': ['id1', 'id2', 'id3'], 'second_column': ['1', '2', '2'], 'third_column': ['1', '2', '2'], 'fourth_column': ['1', '2', '1'] } df1 = pd.DataFrame(data1) data2 = { 'first_column': ['id1', 'id2', 'id3', 'id4'], 'second_column': ['3', '4', '2', '2'], 'third_column': ['1', '2', '2', '2'], 'fourth_column': ['1', '2', '2', '2'] } df2 = pd.DataFrame(data2)
解决方案代码
def find_mismatched_columns(df_a, df_b, id_col='first_column', compare_cols=None): # 自动获取两表共有的非ID列作为默认对比列 if compare_cols is None: common_cols = set(df_a.columns) & set(df_b.columns) compare_cols = [col for col in common_cols if col != id_col] # 外连接合并两表,添加后缀区分来源 merged_df = pd.merge(df_a, df_b, on=id_col, how='outer', suffixes=('_df1', '_df2')) # 为每个对比列生成不匹配标记 for col in compare_cols: col_a = f"{col}_df1" col_b = f"{col}_df2" # 处理空值:空值与非空值视为不匹配 merged_df[f"{col}_mismatch"] = ~merged_df[col_a].fillna('').eq(merged_df[col_b].fillna('')) # 筛选出存在至少一个不匹配的行 mismatch_mask = merged_df[[f"{col}_mismatch" for col in compare_cols]].any(axis=1) result_df = merged_df[mismatch_mask].copy() # 整理输出列顺序:ID + 各列的两个值 + 不匹配标记 output_cols = [id_col] for col in compare_cols: output_cols.extend([f"{col}_df1", f"{col}_df2", f"{col}_mismatch"]) return result_df[output_cols]
使用示例
# 调用函数,对比所有共有的非ID列 mismatch_result = find_mismatched_columns(df1, df2) print("值不匹配结果表:") print(mismatch_result)
输出结果
值不匹配结果表: first_column second_column_df1 second_column_df2 second_column_mismatch third_column_df1 third_column_df2 third_column_mismatch fourth_column_df1 fourth_column_df2 fourth_column_mismatch 0 id1 1 3 True 1 1 False 1 1 False 1 id2 2 4 True 2 2 False 2 2 False 2 id3 2 2 False 2 2 False 1 2 True 3 id4 NaN 2 True NaN 2 True NaN 2 True
关键说明
- 灵活对比列:可通过
compare_cols参数指定要对比的列,不指定则自动对比两表共有的非ID列 - 完整ID覆盖:使用外连接保留所有ID,包括仅在其中一个表存在的记录(如示例中的id4)
- 空值处理:将空值填充为空字符串后对比,确保空值与非空值被识别为不匹配
- 清晰标记:为每个对比列生成独立的不匹配标记,便于定位差异
内容的提问来源于stack exchange,提问作者yoopiyo
相关产品推荐
相关产品推荐

