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

如何在Pandas中基于两列其一的匹配键合并两个数据表?

Pandas左连接匹配两列(name/alias)的解决方案

针对你的需求,这里提供两种实用的实现方式,均基于「table1.name和alias值唯一」的前提:

方法一:分步匹配补全(优先匹配name)

先按name做左连接,再对未匹配到的行用alias补全,最终合并结果:

# 1. 先匹配name列
merged_name = table2.merge(table1, how='left', left_on='name_or_alias', right_on='name')
# 2. 筛选未匹配的行,匹配alias列
unmatched_rows = merged_name[merged_name['col3'].isna()].drop(columns=['name', 'alias', 'col3'])
merged_alias = unmatched_rows.merge(table1, how='left', left_on='name_or_alias', right_on='alias')
# 3. 合并结果,自动填充缺失值
final_result = merged_name.combine_first(merged_alias)
# 整理列顺序(可选)
final_result = final_result[['name_or_alias', 'col2', 'col3']]

方法二:重塑table1后一次性匹配

把table1的name和alias合并成同一列,再直接左连接,这种方式更简洁:

# 重塑table1:将name和alias转为匹配键列,保留col3
table1_melted = table1.melt(
    id_vars=['col3'],
    value_vars=['name', 'alias'],
    var_name='match_type',  # 可选列,标记是name还是alias匹配的
    value_name='match_key'
)
# 左连接获取结果
final_result = table2.merge(table1_melted, how='left', left_on='name_or_alias', right_on='match_key')
# 清理冗余列(可选)
final_result = final_result[['name_or_alias', 'col2', 'col3']]

注意点

  • 你之前的代码存在参数错误:merge的第一个参数应该是table1,且需要用left_on和right_on指定两边的连接列(因为列名不同),而不是直接用on。
  • 由于table1的name和alias无重复值,两种方法都不会产生重复行,结果一致;如果有优先级需求(比如优先取name的匹配结果),方法一更贴合逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:03:31