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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:45:31