如何使用join()方法基于多个键连接两个Pandas DataFrame
用join()实现多键DataFrame连接的正确方式
你之前的代码报错,问题出在set_index的参数传递上——多列设置索引时必须用列表包裹列名,而不是单独传两个参数。直接写left.set_index('key1','key2')会把第二个参数'key2'当成drop参数(该参数控制是否删除原列,默认值为True),导致索引只设置了key1,自然无法和右侧的双索引DataFrame匹配。
正确实现代码
要得到和pd.merge(left, right, on=["key1", "key2"])完全一致的内连接结果,需要:
- 给两个DataFrame都设置多列索引(用列表传入列名)
- 在
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
相关产品推荐
相关产品推荐

