如何实现pandas两DataFrame多列条件合并,非空可选列参与匹配
你的思路完全可行,这是pandas处理多条件OR关联场景的常用实现方案。由于pd.merge的关联条件仅支持AND逻辑,无法直接写OR规则,你可以选择以下两种实现方式:
方案1:分两次关联再去重(你提到的思路)
import pandas as pd # 示例数据 df1 = pd.DataFrame({ 'col1': ['a','b','c', 'd'], 'optional_col2': ['X',None,'Z','V'], 'optional_col3': [None,'def', 'ghi','jkl'] }) df2 = pd.DataFrame({ 'col1': ['a','b','c', 'd'], 'optional_col2': ['X','Y','Z','W'], 'optional_col3': ['abc', 'def', 'ghi','mno'] }) # 第一次按col1 + optional_col2关联 merge_col2 = pd.merge(df1, df2, on=['col1', 'optional_col2'], how='inner', suffixes=('_df1', '_df2')) # 第二次按col1 + optional_col3关联 merge_col3 = pd.merge(df1, df2, on=['col1', 'optional_col3'], how='inner', suffixes=('_df1', '_df2')) # 合并结果、去重、调整列名 merged_df = pd.concat([merge_col2, merge_col3], axis=0) merged_df = merged_df[['col1', 'optional_col2_df2', 'optional_col3_df2']].drop_duplicates() merged_df.columns = ['col1', 'optional_col_2', 'optional_col_3']
方案2:先按col1关联再过滤(和你给出的SQL逻辑完全等价)
如果数据量不大,这个方案逻辑更直观,和SQL写法的对应关系更清晰:
# 先按col1做全量内连接 temp = pd.merge(df1, df2, on='col1', how='inner', suffixes=('_df1', '_df2')) # 过滤满足OR条件的行:可选列任意一列匹配即可 cond = (temp['optional_col2_df1'] == temp['optional_col2_df2']) | (temp['optional_col3_df1'] == temp['optional_col3_df2']) merged_df = temp.loc[cond, ['col1', 'optional_col2_df2', 'optional_col3_df2']].drop_duplicates() merged_df.columns = ['col1', 'optional_col_2', 'optional_col_3']
两种方案最终输出的结果和你给出的预期完全一致,且pandas中NaN和任意值的等值判断结果都为False,刚好适配你的规则:df1中可选列为空的场景下,对应列的匹配条件自动不生效,只会判断另一列是否匹配。
内容的提问来源于stack exchange,提问作者TomNash
相关产品推荐
相关产品推荐

