Pandas 1.1.0+ 可用 sort_values(key=...) 实现任意排序逻辑,key 接收函数,输入原始 Series/DataFrame 子集,输出等长可比序列;旧版需临时列或 reindex,易错不直观。

直接用 sort_values 的 key 参数,这是 Pandas 1.1.0+ 支持的最干净方式;老版本只能靠临时列或 reindex + 自定义索引,容易出错且不直观。
用 sort_values(key=...) 实现任意排序逻辑
这个参数接受一个函数,输入是原始 Series,输出是用于比较的 Series(类型需支持排序,如数值、字符串或有序 Categorical)。它不修改原数据,只影响排序依据。
- 适用于单列或多列联合排序:多列时
key函数接收整个 DataFrame 子集(axis=0) - 函数必须返回与输入等长、可比对的结构,否则抛
ValueError: Length mismatch - 注意返回值类型一致性——比如把数字映射成字符串再排序,可能不符合预期语义
# 按字符串长度升序
df.sort_values('name', key=lambda x: x.str.len())
<h1>按月份名称排序(非字典序,而是日历序)</h1><p>month_order = ['Jan', 'Feb', 'Mar', 'Apr']
df.sort_values('month', key=lambda x: x.map({m: i for i, m in enumerate(month_order)}))
旧版 Pandas(
没有 key 参数时,常见做法是构造临时排序键列再排序,但必须手动清理,否则污染 DataFrame。
- 加列后忘记
drop或pop,导致后续计算误用该列 - 用
argsort+iloc更安全,但需确保索引未重置过:df.iloc[df['col'].apply(custom_rank).argsort()] - 若排序逻辑依赖多列交互(如“优先按状态分组,组内按时间倒序”),临时列易写错,
key方式天然支持sort_values(['status', 'time'], key=lambda x: ...)的组合
自定义排序遇上 NaN 和类型混合怎么办
sort_values 默认把 NaN 放最后(na_position='last'),但 key 函数若返回 NaN 或不可比对象(如 None),会触发 TypeError: unorderable types。
立即学习“Python免费学习笔记(深入)”;
- 务必在
key函数里显式处理缺失值:用x.fillna(...)或x.where(x.notna(), some_default) - 避免在
key中返回混合类型(如部分 int、部分 str),Pandas 不会自动转换,排序结果未定义 - 性能敏感场景下,
key函数会被逐列调用,避免在里面做重操作(如读文件、查数据库)
真正麻烦的不是写排序逻辑,而是当 key 函数返回了看似合理但隐含类型转换的值——比如用 str.upper() 处理含 NaN 的列,结果是 NaN 变成字符串 'NAN',排序位置完全跑偏。这类问题不会报错,只能靠肉眼核对或加断言验证 key 输出。

















