核心方法
Pandas 提供了两个主要的排序方法:

df.sort_values(): 按值排序,这是最常用的方法,它根据 DataFrame 中的一个或多个列的值对行进行排序。df.sort_index(): 按索引排序,它根据 DataFrame 的行索引或列索引进行排序。
按 sort_values() 对列值进行排序
这是最核心的排序功能。
基本语法
df.sort_values(by, axis=0, ascending=True, inplace=False, na_position='last')
参数详解
| 参数 | 类型 | 描述 | 默认值 |
|---|---|---|---|
by |
str 或 list |
必需参数,指定要依据哪个列或哪些列进行排序,可以是单个列名(字符串),也可以是多个列名的列表。 | - |
axis |
int 或 str |
指定排序的轴。0 或 'index' 表示按行排序(即对列值排序);1 或 'columns' 表示按列排序(即对行值排序)。 |
0 |
ascending |
bool 或 list |
排序的顺序。True 为升序(从小到大),False 为降序(从大到小),如果传入一个布尔值的列表,则可以分别控制 by 中每个列的排序顺序。 |
True |
inplace |
bool |
是否在原地修改 DataFrame,如果为 True,则直接修改原 DataFrame,方法返回 None,如果为 False,则返回一个新的排序后的 DataFrame,原 DataFrame 不变。 |
False |
na_position |
str |
指定 NaN(缺失值)的位置。'first' 表示放在最前面,'last' 表示放在最后面。 |
'last' |
示例
我们创建一个示例 DataFrame:
import pandas as pd
import numpy as np
data = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七', '周八'],
'年龄': [25, 32, 28, np.nan, 22, 35],
'分数': [88, 92, 76, 85, 90, 78]
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
原始 DataFrame:
姓名 年龄 分数
0 张三 25.0 88
1 李四 32.0 92
2 王五 28.0 76
3 赵六 NaN 85
4 孙七 22.0 90
5 周八 35.0 78
示例 1:按单列升序排序
# 按 '年龄' 列升序排序
sorted_df = df.sort_values(by='年龄')
print("\n按 '年龄' 升序排序:")
print(sorted_df)
按 '年龄' 升序排序:
姓名 年龄 分数
4 孙七 22.0 90
0 张三 25.0 88
2 王五 28.0 76
1 李四 32.0 92
5 周八 35.0 78
3 赵六 NaN 85 # NaN 默认排在最后
示例 2:按单列降序排序
# 按 '分数' 列降序排序
sorted_df = df.sort_values(by='分数', ascending=False)
print("\n按 '分数' 降序排序:")
print(sorted_df)
按 '分数' 降序排序:
姓名 年龄 分数
1 李四 32.0 92
4 孙七 22.0 90
0 张三 25.0 88
3 赵六 NaN 85
2 王五 28.0 76
5 周八 35.0 78
示例 3:按多列排序(先按第一列,再按第二列)
当传入一个列名列表时,排序会按列表的顺序依次进行。
# 先按 '年龄' 升序,如果年龄相同,再按 '分数' 降序
sorted_df = df.sort_values(by=['年龄', '分数'], ascending=[True, False])
print("\n先按 '年龄' 升序,再按 '分数' 降序:")
print(sorted_df)
先按 '年龄' 升序,再按 '分数' 降序:
姓名 年龄 分数
4 孙七 22.0 90 # 年龄最小,分数最高
0 张三 25.0 88 # 年龄第二,分数第二
2 王五 28.0 76 # 年龄第三,分数最低
1 李四 32.0 92 # 年龄第四,分数最高
5 周八 35.0 78 # 年龄最大,分数较低
3 赵六 NaN 85 # NaN 仍然排在最后
示例 4:处理缺失值 NaN
# 将 NaN 值排在最前面
sorted_df_nan_first = df.sort_values(by='年龄', na_position='first')
print("\n将 NaN 值排在最前面:")
print(sorted_df_nan_first)
将 NaN 值排在最前面:
姓名 年龄 分数
3 赵六 NaN 85
4 孙七 22.0 90
0 张三 25.0 88
2 王五 28.0 76
1 李四 32.0 92
5 周八 35.0 78
示例 5:原地排序 (inplace=True)
# 原地按 '分数' 降序排序
df.sort_values(by='分数', ascending=True, inplace=True)
print("\n原地排序后的 DataFrame:")
print(df)
# 注意:此时原始 df 已经被改变
按 sort_index() 对索引进行排序
当你修改了 DataFrame 的行顺序后,索引可能会变得混乱,这时就需要用 sort_index() 来重置索引的顺序。

基本语法
df.sort_index(axis=0, level=None, ascending=True, inplace=False, na_position='last')
参数与 sort_values() 类似,但 by 参数被 level(用于多级索引)替代。
示例
我们使用上面示例 3 排序后的 DataFrame,它的索引顺序是 [4, 0, 2, 1, 5, 3]。
# 使用上面示例3的排序结果
df_multi_sorted = df.sort_values(by=['年龄', '分数'], ascending=[True, False])
print("多列排序后的 DataFrame (索引混乱):")
print(df_multi_sorted)
多列排序后的 DataFrame (索引混乱):
姓名 年龄 分数
4 孙七 22.0 90
0 张三 25.0 88
2 王五 28.0 76
1 李四 32.0 92
5 周八 35.0 78
3 赵六 NaN 85
我们按索引进行排序:
# 按索引升序排序
df_sorted_by_index = df_multi_sorted.sort_index()
print("\n按索引排序后:")
print(df_sorted_by_index)
按索引排序后:
姓名 年龄 分数
0 张三 25.0 88
1 李四 32.0 92
2 王五 28.0 76
3 赵六 NaN 85
4 孙七 22.0 90
5 周八 35.0 78
可以看到,行数据保持不变,但行的顺序已经按照索引 [0, 1, 2, 3, 4, 5] 重新排列了。

按行进行排序(按列值排序)
sort_values() 也可以对列进行排序,这需要设置 axis=1。
示例
# 创建一个新的 DataFrame
data_cols = {
'Q1': [100, 80, 95],
'Q2': [110, 85, 105],
'Q3': [105, 90, 100]
}
df_cols = pd.DataFrame(data_cols, index=['产品A', '产品B', '产品C'])
print("原始按列排序的 DataFrame:")
print(df_cols)
原始按列排序的 DataFrame:
Q1 Q2 Q3
产品A 100 110 105
产品B 80 90 90
产品C 95 105 100
示例 6:按列值升序排序
这将根据每列的值对列本身进行重新排列。
# 按 '产品A' 这一行的值对所有列进行升序排序
sorted_cols_df = df_cols.sort_values(by='产品A', axis=1)
print("\n按 '产品A' 行的值对列进行升序排序:")
print(sorted_cols_df)
按 '产品A' 行的值对列进行升序排序:
Q1 Q3 Q2
产品A 100 105 110
产品B 80 90 90
产品C 95 100 105
解释:比较 产品A 行的值 100, 110, 105,升序排列后是 100 (Q1), 105 (Q3), 110 (Q2),所以列的顺序变成了 Q1, Q3, Q2。
总结与最佳实践
| 需求 | 推荐方法 | 示例 |
|---|---|---|
| 根据一个或多个列的值对行进行排序 | df.sort_values(by=['col1', 'col2']) |
df.sort_values(by='年龄', ascending=False) |
| 根据索引对行进行排序(重置行顺序) | df.sort_index() |
df.sort_index() |
| 根据行的值对列进行排序 | df.sort_values(by='row_name', axis=1) |
df.sort_values(by='产品A', axis=1) |
| 希望原地修改 DataFrame | df.sort_values(..., inplace=True) |
df.sort_values(by='分数', inplace=True) |
| 希望保留原始 DataFrame | sorted_df = df.sort_values(...) (默认) |
new_df = df.sort_values(by='年龄') |
重要提示:
- 优先使用
inplace=False:除非你确定不需要原始 DataFrame,否则最好将排序后的结果赋给一个新变量,这样可以避免意外修改原始数据,使代码更易于调试和维护。 NaN处理:默认情况下,NaN会被排在最后,如果业务逻辑要求NaN排在最前,记得设置na_position='first'。
