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

关于Pandas.sort_values多列排序逻辑的疑问及代码验证

Pandas sort_values多列排序逻辑解析

为什么你的两次排序结果一致

你的数据里col1的所有非空值都是唯一的(A、Z、E、D、C、B无重复),NaN单独成组。这种情况下,第一列已经完全确定了整个DataFrame的排序顺序,后续的col2、col3没有发挥作用的空间——因为没有重复的col1值需要进一步用其他列区分排序。

Pandas多列排序的真实逻辑

sort_values的多列排序是层级优先级排序,绝非各列独立排序,具体逻辑:

  • 先按by参数的第一列排序,将数据按列值分成若干分组
  • 对每个分组内部,再按第二列排序
  • 若有更多列,重复上述步骤:在已排好的子分组内,继续按下一列细化排序

举个修改后的示例,让col1出现重复值,就能看到差异:

import pandas as pd
import numpy as np

df = pd.DataFrame({
'col1' : ['A', 'Z', 'E', np.nan, 'A', 'C','B'],  # 将原'D'改为'A',制造重复项
'col2' : [2, 1, 9, 8, 7, 4,10],
'col3': [0, 1, 9, 4, 2, 3,1],
'col4': [11,12,12,13,14,55,56], })

df_sort1= df.sort_values(by=['col1', 'col2','col3'])
df_sort2= df.sort_values(by=['col1'])

此时df_sort1中col1为A的两行会按col2的大小(2 < 7)排序,而df_sort2里这两行会保留原始数据的相对顺序,两者结果完全不同。

你的理解误区

你之前误以为多列排序是各列独立排序后再合并,但实际是递进式分组排序:只有当前一列存在重复值时,后续列才会影响排序结果;如果前一列所有值唯一,后面的列不会改变最终顺序。

补充:默认情况下,相同值的行会保留原始DataFrame中的相对顺序(稳定排序),除非指定kind='quicksort'(非稳定)或ignore_index=True重置索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:45:16