如何用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_1 | key_col | col_2 | col_3 | col_4 |
|---|---|---|---|---|
| a | key1 | b | c | d |
| w | key2 | x | y | z |
df2数据
| col_1 | key_col | col_2 | col_3 | col_4 |
|---|---|---|---|---|
| a | key1 | b | p | q |
| w | key2 | x | y | z |
| w | key3 | i | j | k |
期望输出
| key_col | mismatched_column_names | mismatched_values_in_first_df | mismatched_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())
代码说明
- 外连接合并:通过
pd.merge做外连接,保留两个DataFrame的所有行,用suffixes标记来自不同DataFrame的同名列。 - 逐列对比:遍历非键列,判断每行对应值是否不匹配(包括一方缺失的情况),记录不匹配的列名和对应值。
- 过滤与整理:过滤掉无任何不匹配项的行,最终输出符合要求的结果格式。
内容的提问来源于stack exchange,提问作者Rahul Kumar
相关产品推荐
相关产品推荐

