- 按列的值排序:这是最常用的排序方式,即根据某一列或多列的数据大小对整个 DataFrame 的行进行重新排列。
- 按索引排序:根据 DataFrame 的行索引或列索引进行排序。
下面我将详细介绍这两种排序方法,并提供丰富的示例。

准备工作:创建示例 DataFrame
我们创建一个用于演示的 DataFrame。
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'年龄': [25, 32, 28, 45, 22, 35],
'分数': [88, 92, 76, 85, 90, 78],
'部门': ['研发', '市场', '研发', '销售', '市场', '研发']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
输出:
原始 DataFrame:
姓名 年龄 分数 部门
0 张三 25 88 研发
1 李四 32 92 市场
2 王五 28 76 研发
3 赵六 45 85 销售
4 钱七 22 90 市场
5 孙八 35 78 研发
按列的值排序
使用 DataFrame.sort_values() 方法。
按单列排序
语法: df.sort_values(by='列名', ascending=True/False, inplace=True/False)

by: 指定要排序的列名(字符串)。ascending: 布尔值,排序顺序。True(默认): 升序 (从小到大)。False: 降序 (从大到小)。
inplace: 布尔值,是否在原 DataFrame 上修改。False(默认): 返回一个新的排序后的 DataFrame,原 DataFrame 不变。True: 直接在原 DataFrame 上进行排序,不返回任何值。
示例 1: 按“年龄”列升序排序
# 按 '年龄' 列升序排序 (默认)
df_sorted_age_asc = df.sort_values(by='年龄')
print("\n按 '年龄' 升序排序:")
print(df_sorted_age_asc)
输出:
按 '年龄' 升序排序:
姓名 年龄 分数 部门
4 钱七 22 90 市场
0 张三 25 88 研发
2 王五 28 76 研发
1 李四 32 92 市场
5 孙八 35 78 研发
3 赵六 45 85 销售
示例 2: 按“分数”列降序排序
# 按 '分数' 列降序排序
df_sorted_score_desc = df.sort_values(by='分数', ascending=False)
print("\n按 '分数' 降序排序:")
print(df_sorted_score_desc)
输出:
按 '分数' 降序排序:
姓名 年龄 分数 部门
1 李四 32 92 市场
4 钱七 22 90 市场
0 张三 25 88 研发
3 赵六 45 85 销售
2 王五 28 76 研发
5 孙八 35 78 研发
按多列排序
当 by 参数传入一个列名列表时,即可实现多列排序,排序的优先级与列表中的顺序一致:先按第一个列排序,如果第一个列的值相同,再按第二个列排序,以此类推。
示例 3: 先按“部门”升序,再按“分数”降序
# 先按 '部门' (A-Z) 排序,部门相同时,再按 '分数' (从高到低) 排序
df_sorted_multi = df.sort_values(by=['部门', '分数'], ascending=[True, False])
print("\n先按 '部门' 升序,再按 '分数' 降序排序:")
print(df_sorted_multi)
输出:
先按 '部门' 升序,再按 '分数' 降序排序:
姓名 年龄 分数 部门
0 张三 25 88 研发
5 孙八 35 78 研发
2 王五 28 76 研发
1 李四 32 92 市场
4 钱七 22 90 市场
3 赵六 45 85 销售
解释:
- 所有“研发”部门的记录排在最前面,内部按分数从高到低(张三88 > 孙八78 > 王五76)。
- 所有“市场”部门的记录排在中间,内部按分数从高到低(李四92 > 钱七90)。
- “销售”部门只有一条记录,排在最后。
按索引排序
使用 DataFrame.sort_index() 方法。
按行索引排序
语法: df.sort_index(axis=0, ascending=True/False, inplace=True/False)
axis:0(默认) 表示按行索引排序,1表示按列索引排序。ascending和inplace参数与sort_values()含义相同。
示例 4: 按行索引降序排序
# 按 行索引 降序排序
df_sorted_index_desc = df.sort_index(ascending=False)
print("\n按行索引降序排序:")
print(df_sorted_index_desc)
输出:
按行索引降序排序:
姓名 年龄 分数 部门
5 孙八 35 78 研发
4 钱七 22 90 市场
3 赵六 45 85 销售
2 王五 28 76 研发
1 李四 32 92 市场
0 张三 25 88 研发
按列索引排序
示例 5: 按列索引升序排序 (默认就是升序)
# 按 列索引 (A-Z) 排序
df_sorted_columns = df.sort_index(axis=1)
print("\n按列索引升序排序:")
print(df_sorted_columns)
输出:
按列索引升序排序:
部门 姓名 年龄 分数
0 研发 张三 25 88
1 市场 李四 32 92
2 研发 王五 28 76
3 销售 赵六 45 85
4 市场 钱七 22 90
5 研发 孙八 35 78
重要参数:na_position
当数据中存在缺失值 (NaN) 时,可以使用 na_position 参数来控制 NaN 值的排布位置。
na_position='first'(默认): 将NaN值放在最前面。na_position='last': 将NaN值放在最后面。
示例 6: 处理缺失值
# 创建一个带有 NaN 值的 DataFrame
df_with_nan = df.copy()
df_with_nan.loc[1, '分数'] = np.nan
df_with_nan.loc[3, '年龄'] = np.nan
print("\n带有 NaN 值的 DataFrame:")
print(df_with_nan)
# 默认情况下,NaN 会被排在最前面
print("\n按 '年龄' 升序排序 (NaN 在前):")
print(df_with_nan.sort_values(by='年龄'))
# 将 NaN 放在最后面
print("\n按 '年龄' 升序排序 (NaN 在后):")
print(df_with_nan.sort_values(by='年龄', na_position='last'))
输出:
带有 NaN 值的 DataFrame:
姓名 年龄 分数 部门
0 张三 25.0 88.0 研发
1 李四 32.0 NaN 市场
2 王五 28.0 76.0 研发
3 赵六 NaN 85.0 销售
4 钱七 22.0 90.0 市场
5 孙八 35.0 78.0 研发
按 '年龄' 升序排序 (NaN 在前):
姓名 年龄 分数 部门
3 赵六 NaN 85.0 销售
4 钱七 22.0 90.0 市场
0 张三 25.0 88.0 研发
2 王五 28.0 76.0 研发
1 李四 32.0 NaN 市场
5 孙八 35.0 78.0 研发
按 '年龄' 升序排序 (NaN 在后):
姓名 年龄 分数 部门
4 钱七 22.0 90.0 市场
0 张三 25.0 88.0 研发
2 王五 28.0 76.0 研发
1 李四 32.0 NaN 市场
5 孙八 35.0 78.0 研发
3 赵六 NaN 85.0 销售
| 方法 | 功能 | 常用参数 | 示例 |
|---|---|---|---|
df.sort_values() |
按列的值对行进行排序 | by (列名), ascending (升降序), inplace (是否原地修改), na_position (NaN位置) |
df.sort_values(by='年龄', ascending=False) |
df.sort_index() |
按索引进行排序 | axis (0=行索引, 1=列索引), ascending, inplace |
df.sort_index(ascending=False) |
核心要点:
- 按值排序用
sort_values,按索引排序用sort_index。 inplace=False是更安全、更推荐的做法,因为它会保留原始数据。- 多列排序时,
by和ascending都传入列表,顺序要对应。 - 遇到
NaN值时,记得使用na_position来控制其位置。
