如何对含不一致值的Pandas DataFrame外合并并识别未匹配项?
区分Pandas外连接中的匹配与未匹配数据项
首先给出两个待合并的DataFrame:
import pandas as pd df1 = pd.DataFrame({'F_Name': ['Alice', 'Bob', 'Charlie', 'Dave'], 'L_Name': ['Smith', 'Sharma', 'Puth', 'Bautista'], 'Age':[15, 24, 32, 40]}) df2 = pd.DataFrame({'F_Name': ['Charlie', 'David', 'Eve', 'Alice'], 'L_Name': ['Puth', 'Bautista', 'Angeline', 'Wonderland'], 'Age':[32,19,21,16]})
常规外连接仅返回合并后的DataFrame,无法直接区分数据来源。要实现区分未匹配项的需求,只需在merge时添加indicator=True参数,Pandas会自动生成_merge列标记每条数据的来源:
# 带来源标记的外连接 df_merge = pd.merge(df1, df2, how='outer', on=['F_Name', 'L_Name', 'Age'], indicator=True)
_merge列的取值说明:
both:该数据行在df1和df2中都存在(完全匹配)left_only:仅在df1中存在,df2无匹配项right_only:仅在df2中存在,df1无匹配项
筛选目标数据
根据_merge列可快速筛选出各类数据:
# 仅在df1中存在的数据 only_df1 = df_merge[df_merge['_merge'] == 'left_only'] # 仅在df2中存在的数据 only_df2 = df_merge[df_merge['_merge'] == 'right_only'] # 两边完全匹配的数据 matched_data = df_merge[df_merge['_merge'] == 'both']
优化来源标签(可选)
如果觉得默认标签不够直观,可以将_merge列替换为更易懂的中文标签:
df_merge['数据来源'] = df_merge['_merge'].map({ 'left_only': '仅来自df1', 'right_only': '仅来自df2', 'both': '两边匹配' }) # 删除原_merge列 df_merge = df_merge.drop('_merge', axis=1)
内容的提问来源于stack exchange,提问作者Ronathan
相关产品推荐
相关产品推荐

