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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:27:03