sort_values()默认升序、返回新dataframe;多列排序by传列表,ascending可传等长布尔列表;nan默认排末尾,na_position可调;inplace=true禁用链式调用。

用 sort_values() 按单列排序,别漏掉 inplace 和 ascending
默认是升序,想降序必须显式写 ascending=False,不写就永远是升序,这点容易被忽略。另外 sort_values() 默认返回新 DataFrame,原数据不动;如果想直接改原变量,得加 inplace=True,但注意:设了 inplace=True 就不能再链式调用了(比如后面接 .head()),会返回 None。
-
df.sort_values('age')→ 升序,返回新对象 -
df.sort_values('age', ascending=False)→ 降序 -
df.sort_values('age', inplace=True)→ 原地修改,返回None
多列排序时,by 是列表,顺序决定优先级
传给 by 的列表里,靠前的列先排,相等再按后一个排。比如 by=['city', 'age'] 先按城市字母序排,同城市的才按年龄排。如果想让其中一列反向,ascending 可以传布尔值列表,长度必须和 by 一致。
-
df.sort_values(by=['city', 'age'])→ 先 city 升序,再 age 升序 -
df.sort_values(by=['city', 'age'], ascending=[True, False])→ city 升序,age 降序 - 错例:
ascending=False单个布尔值 → 所有列都降序,不是只降第二列
含缺失值(NaN)时,默认排在最后,可改用 na_position
Pandas 默认把 NaN 当作“最大值”,所以升序时它出现在末尾,降序时也在末尾(因为所有非空值都比它小)。这不是 bug,是设计行为。如果要让它出现在开头,加 na_position='first'。
-
df.sort_values('score')→NaN在最后 -
df.sort_values('score', na_position='first')→NaN在最前 -
na_position只接受'first'或'last',传其他值会报ValueError
性能注意:大 DataFrame 排序慢,kind 参数能微调算法
默认用 kind='quicksort',稳定但最坏情况 O(n²);对已部分有序的数据,mergesort 更稳(O(n log n) 且稳定),但内存多一倍;heapsort 内存少但不稳定(相同值的相对位置可能变)。一般不用动,除非你真卡在排序耗时上,且知道数据分布特征。
- 默认:
df.sort_values('id')→ 等价于kind='quicksort' - 要稳定且不怕内存:
df.sort_values('id', kind='mergesort') - 别乱试
heapsort,除非你确认不需要保持相同值的原始顺序
NaN 的默认位置、ascending 的广播规则、还有 inplace=True 后链式调用失效——这三个点,每次写都可能翻车。










