sort_values默认返回新dataframe且不修改原数据;多列排序需用ascending列表匹配列数;nan默认排最后,可用na_position控制;大数据量优先用nlargest/nsmallest;弃用inplace=true。

按单列升序排序时,sort_values 默认不改原数据
直接调用 df.sort_values('column_name') 返回新 DataFrame,原 df 一动不动。很多人发现“排完序没变化”,其实是忘了赋值或加 inplace=True。
- 要修改原数据:用
df.sort_values('column_name', inplace=True) - 更推荐不改原数据:写成
df_sorted = df.sort_values('column_name'),避免副作用 -
inplace=True在 Pandas 2.0+ 已被标记为弃用,未来可能移除,建议早适应链式写法
多列混合排序(升序+降序)必须用 ascending 列表
想按 'region' 升序、再按 'sales' 降序?不能写 ascending=True, False——语法报错。必须显式传列表。
- 正确写法:
df.sort_values(['region', 'sales'], ascending=[True, False]) - 常见错误:
ascending=False会作用到所有列,不是只降序第二列 - 列数和
ascending列表长度必须一致,否则抛ValueError: Length of ascending must match length of by
含空值(NaN)时排序结果不符合直觉
sort_values 默认把 NaN 放最后(升序)或最前(降序),但很多人以为它会跳过或报错。尤其做分组内排序时,NaN 可能“卡”在中间位置,导致切片出错。
- 控制 NaN 位置:用
na_position='first'或'last'(默认是'last') - 如果业务要求 NaN 当 0 处理,先用
df['col'].fillna(0),别指望排序自动填补 - 字符串列含 NaN 时,
sort_values仍能运行,但比较逻辑是 Python 的None ,行为稳定但不易察觉
大数据量下 sort_values 慢?先确认是否真需要全量排序
100 万行以上 DataFrame 调用 sort_values 可能卡顿,但往往问题不在函数本身,而在没剪枝。
- 只要 Top N:用
df.nlargest(10, 'score')或df.nsmallest(5, 'price'),比先排再切快得多 - 已按某列索引?考虑设
df = df.set_index('date').sort_index(),后续按索引取值 O(1) - 频繁按同一列排序:提前
df = df.sort_values('category').reset_index(drop=True),配合searchsorted做二分定位
真正卡住的时候,大概率是忘了 copy() 或正在对未清理的 object 类型列排序——比如把数字当字符串存了,排序就变成字典序。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











