sort_values支持多列排序,按列名列表顺序逐级排序,默认nan排末尾,ascending可统一或分列指定升序,inplace=true禁用链式调用,大数据量时注意性能与内存。

sort_values 传入列名列表就能多列排序,但顺序和升序设置很关键
直接把列名写成列表传给 sort_values 就行,比如 df.sort_values(['col_a', 'col_b'])。它默认按列表顺序逐列排序:先排 col_a,相同时再按 col_b 排。不是“同时按两列算一个复合键”,而是典型的稳定多级排序。
升序降序必须用 ascending 参数统一控制,不能单列指定
ascending 接收布尔值或布尔列表。传单个 True 或 False 会应用到所有列;传列表(如 [True, False])时,长度必须和列名列表一致,一一对应。漏掉或长度不匹配会直接报错 ValueError: Length of ascending must match length of by。
-
df.sort_values(['age', 'score'], ascending=[True, False]):年龄升序,同龄人分数降序 -
df.sort_values(['category', 'id'], ascending=False):两列都降序
空值(NaN)默认排在末尾,影响多列排序结果易被忽略
Pandas 默认把 NaN 当作“最大值”处理,无论升序降序都排在最后。这在多列排序中可能造成意外断层——比如按 ['group', 'value'] 升序,所有 group 为 NaN 的行会扎堆出现在整个结果末尾,而不是按 value 再细分。需要显式控制用 na_position='first' 或 'last'(后者是默认)。
-
df.sort_values(['a', 'b'], na_position='first'):所有含 NaN 的行排最前 - 如果某列有大量缺失,又参与多级排序,务必确认
na_position是否符合业务预期
inplace=True 不返回新 DataFrame,链式调用会失效
加 inplace=True 会直接修改原 df,函数返回 None。这意味着你不能写 df.sort_values(...).head() 这种链式操作,会报 AttributeError: 'NoneType' object has no attribute 'head'。要么分开写,要么去掉 inplace 保持返回值。
- ✅ 正确:
result = df.sort_values(['x', 'y']); result.head() - ✅ 正确:
df.sort_values(['x', 'y'], inplace=True); df.head() - ❌ 错误:
df.sort_values(['x', 'y'], inplace=True).head()
sort_values 总是返回新视图或副本,内存占用会翻倍,大数据量时得留意。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











