Pandas合并两个DataFrame时合并键的排列顺序规则是什么?
pandas merge 键排序规则说明
你碰到的结果和预期不符的问题,核心是没注意pd.merge()的sort参数默认行为,你以为的“遍历左表逐行匹配、保留左表键顺序”的逻辑是真实存在的,但不是默认配置。
核心规则
merge提供了sort参数控制连接键在结果中的排列顺序:旧版本pandas中该参数默认值为True,新版本默认值为False。你当前环境触发的是sort=True的逻辑:所有匹配完成的行会先按连接键的字典序/数值升序统一排列,同键的行再按匹配顺序输出,不会保留左表原始的键出现顺序。- 手动设置
sort=False时,才会执行你预期的逻辑:按左表键的遍历顺序逐行匹配右表,匹配到的结果直接追加到输出中,完全保留左表原有键的先后位置。
场景复现
根据你给出的输入输出描述,对应测试代码如下:
import pandas as pd # 构造和示例一致的两个DataFrame df_left = pd.DataFrame({ 'key': ['Z', 'Y', 'Z'], 'val_left': [1, 2, 3] }) df_right = pd.DataFrame({ 'key': ['Y', 'Z'], 'val_right': [2, 3] })
默认merge(sort=True,对应你实际看到的输出)
print(pd.merge(df_left, df_right, on='key'))
输出结果:
key val_left val_right 0 Y 2 2 1 Z 1 3 2 Z 3 3
由于字母Y的字典序排在Z前面,所有key为Y的匹配行会优先输出,之后才输出key为Z的行,和你观察到的实际结果完全一致。
指定sort=False(对应你预期的输出)
print(pd.merge(df_left, df_right, on='key', sort=False))
输出结果:
key val_left val_right 0 Z 1 3 1 Y 2 2 2 Z 3 3
这就完全符合你“先遍历左表每个键,再到右表匹配对应键输出”的逻辑。
提问小建议
后续提问如果能附上可直接运行的复现代码,而非仅放截图,其他人可以更快复现问题、定位原因,解答效率会高很多。
内容的提问来源于stack exchange,提问作者tarun kashyap
相关产品推荐
相关产品推荐

