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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:27:32