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

如何使用join()方法基于多个键连接两个Pandas DataFrame

用join()实现多键DataFrame连接的正确方式

你之前的代码报错,问题出在set_index的参数传递上——多列设置索引时必须用列表包裹列名,而不是单独传两个参数。直接写left.set_index('key1','key2')会把第二个参数'key2'当成drop参数(该参数控制是否删除原列,默认值为True),导致索引只设置了key1,自然无法和右侧的双索引DataFrame匹配。

正确实现代码

要得到和pd.merge(left, right, on=["key1", "key2"])完全一致的内连接结果,需要:

  1. 给两个DataFrame都设置多列索引(用列表传入列名)
  2. 在join方法中指定how='inner'(因为join默认是左连接,而merge默认是内连接)
import pandas as pd

left = pd.DataFrame(
{
    "key1": ["K0", "K0", "K1", "K2"],
    "key2": ["K0", "K1", "K0", "K1"],
    "A": ["A0", "A1", "A2", "A3"],
    "B": ["B0", "B1", "B2", "B3"],
})

right = pd.DataFrame(
{
    "key1": ["K0", "K1", "K1", "K2"],
    "key2": ["K0", "K0", "K0", "K0"],
    "C": ["C0", "C1", "C2", "C3"],
    "D": ["D0", "D1", "D2", "D3"],
})

# 正确的join实现(内连接,和merge默认行为一致)
result_join = left.set_index(['key1', 'key2']).join(right.set_index(['key1', 'key2']), how='inner')
# 可选:将复合索引恢复为普通列,和merge输出结构完全匹配
result_join = result_join.reset_index()

# 原merge实现
result_merge = pd.merge(left, right, on=["key1", "key2"])

# 验证结果一致
print(result_join.equals(result_merge))  # 输出True

关键说明

  • set_index(['key1','key2']):将多列组合为复合索引,这是多键连接的前提
  • how='inner':对齐merge的默认行为,只保留两边都存在的键组合;如果需要左连接可以省略该参数
  • reset_index():可选操作,将复合索引恢复为DataFrame的普通列,和merge的输出结构完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:50:25