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

如何用Pandas找出两个同结构DataFrame的不匹配列与对应值?

问题描述

我有两个结构完全相同的DataFrame(来自不同数据源),需要以key_col为连接键执行外连接,筛选出不匹配的列及其对应值,最终输出指定格式的结果。

示例代码

import pandas as pd

list1 = [['a', 'key1', 'b', 'c', 'd'], ['w', 'key2', 'x',   'y', 'z']] 

list2 = [['a', 'key1', 'b', 'p', 'q'], ['w', 'key2', 'x',   'y', 'z'], ['w', 'key3', 'i', 'j', 'k']] 
  
# 创建DataFrame并指定列名
df1 = pd.DataFrame(list1, columns=['col_1', 'key_col', 'col_2', 'col_3', 'col_4']) 
print(df1.to_string())
df2 = pd.DataFrame(list2, columns=['col_1', 'key_col', 'col_2', 'col_3', 'col_4']) 
print(df2.to_string())

现有数据

df1数据

col_1key_colcol_2col_3col_4
akey1bcd
wkey2xyz

df2数据

col_1key_colcol_2col_3col_4
akey1bpq
wkey2xyz
wkey3ijk

期望输出

key_colmismatched_column_namesmismatched_values_in_first_dfmismatched_values_in_second_df
key1[col_3, col_4][c, d][p, q]
key3[col_1, col_2, col_3, col_4][None, None, None, None][w, i, j, k]

解决方案代码
import pandas as pd

# 执行外连接,用后缀区分两个DataFrame的列
merged = pd.merge(df1, df2, on='key_col', how='outer', suffixes=('_df1', '_df2'))

# 获取除key_col外的所有列名
non_key_cols = [col for col in df1.columns if col != 'key_col']

# 定义函数处理每行的不匹配项
def extract_mismatches(row):
    mismatched_cols = []
    vals_df1 = []
    vals_df2 = []
    for col in non_key_cols:
        val1 = row[f'{col}_df1']
        val2 = row[f'{col}_df2']
        # 判定不匹配:值不等或其中一方缺失
        if pd.isna(val1) or pd.isna(val2) or val1 != val2:
            mismatched_cols.append(col)
            vals_df1.append(val1 if not pd.isna(val1) else None)
            vals_df2.append(val2 if not pd.isna(val2) else None)
    # 无匹配项则返回空,后续过滤掉
    if not mismatched_cols:
        return None
    return pd.Series(
        [row['key_col'], mismatched_cols, vals_df1, vals_df2],
        index=['key_col', 'mismatched_column_names', 'mismatched_values_in_first_df', 'mismatched_values_in_second_df']
    )

# 应用函数并整理结果
result = merged.apply(extract_mismatches, axis=1).dropna().reset_index(drop=True)

print(result.to_string())

代码说明

  1. 外连接合并:通过pd.merge做外连接,保留两个DataFrame的所有行,用suffixes标记来自不同DataFrame的同名列。
  2. 逐列对比:遍历非键列,判断每行对应值是否不匹配(包括一方缺失的情况),记录不匹配的列名和对应值。
  3. 过滤与整理:过滤掉无任何不匹配项的行,最终输出符合要求的结果格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:55:00