Pandas df.sort_values() 函数
df.sort_values() 是 Pandas 中用于对 DataFrame 的数据按照一个或多个列进行排序的函数。
排序是数据分析中的基础操作,可以帮助你更好地理解数据、发现规律。sort_values() 支持按单列或多列排序、升序或降序排序、可以处理缺失值,是数据处理中不可或缺的工具。
基本语法与参数
sort_values() 是 DataFrame 的成员函数,通过点运算符 . 来调用。
语法格式
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
参数说明
| 参数 | 类型 | 是否必填 | 说明 | 默认值 |
|---|---|---|---|---|
| by | str 或 str 列表 | 必填 | 指定用于排序的列名。如果是列表,则按列表中的顺序依次排序。 | 无 |
| axis | int 或 str | 可选 | 指定排序的轴。0 或 'index' 表示按列排序(默认);1 或 'columns' 表示按行排序。 |
0 |
| ascending | bool 或 bool 列表 | 可选 | 指定排序顺序。True 表示升序(从小到大);False 表示降序(从大到小)。如果是列表,则与 by 中的列一一对应。 |
True |
| inplace | bool | 可选 | 如果为 True,直接在原 DataFrame 上修改,不返回新对象;如果为 False,返回一个新的 DataFrame,原数据不变。 |
False |
| kind | str | 可选 | 指定排序算法。'quicksort'(快速排序)、'mergesort'(归并排序)、'heapsort'(堆排序)、'stable'(稳定排序)。 |
'quicksort' |
| na_position | str | 可选 | 指定缺失值(NaN)的位置。'first' 表示放在最前面;'last' 表示放在最后面。 |
'last' |
| ignore_index | bool | 可选 | 如果为 True,重置排序后的索引,从0开始编号;如果为 False,保留原始索引。 |
False |
| key | callable | 可选 | 在排序前对数据应用一个函数,常用于自定义排序规则。 | None |
返回值说明
- 返回一个新的 DataFrame(如果
inplace=False),或者None(如果inplace=True)。 - 返回的 DataFrame 中的数据已按指定规则排序。
实例
让我们通过一系列例子,彻底掌握 sort_values() 的用法。
示例 1:按单列升序排序
最简单的用法是按照某一列的值进行升序排序。
实例
import pandas as pd
# 创建一个学生成绩 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 92, 78, 90, 88],
'英语': [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 按数学成绩升序排序
df_sorted = df.sort_values(by='数学')
print("按数学成绩升序排序后:")
print(df_sorted)
# 创建一个学生成绩 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 92, 78, 90, 88],
'英语': [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 按数学成绩升序排序
df_sorted = df.sort_values(by='数学')
print("按数学成绩升序排序后:")
print(df_sorted)
运行结果预期:
原始数据: 姓名 数学 英语 0 张三 85 90 1 李四 92 85 2 王五 78 92 3 赵六 90 88 4 钱七 88 78 ================================================== 按数学成绩升序排序后: 姓名 数学 英语 2 王五 78 92 0 张三 85 90 4 钱七 88 78 3 赵六 90 88 1 李四 92 85
代码解析:
- 默认的排序方式是升序(从小到大)。
- 数学成绩 78 分排在最前面,92 分排在最后面。
- 排序后索引保持不变(2, 0, 4, 3, 1)。
示例 2:按单列降序排序
使用 ascending=False 可以实现降序排序。
实例
import pandas as pd
# 创建一个学生成绩 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 92, 78, 90, 88],
'英语': [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 按数学成绩降序排序
df_sorted = df.sort_values(by='数学', ascending=False)
print("按数学成绩降序排序后:")
print(df_sorted)
# 创建一个学生成绩 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 92, 78, 90, 88],
'英语': [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 按数学成绩降序排序
df_sorted = df.sort_values(by='数学', ascending=False)
print("按数学成绩降序排序后:")
print(df_sorted)
运行结果预期:
原始数据: 姓名 数学 英语 0 张三 85 90 1 李四 92 85 2 王五 78 92 3 赵六 90 88 4 钱七 88 78 ================================================== 按数学成绩降序排序后: 姓名 数学 英语 1 李四 92 85 3 赵六 90 88 4 钱七 88 78 0 张三 85 90 2 王五 78 92
代码解析:
- 使用
ascending=False可以实现从大到小的降序排序。 - 李四的数学成绩 92 分排在最前面。
示例 3:按多列排序
可以按照多列进行排序,先按第一列排序,当第一列相同时按第二列排序。
实例
import pandas as pd
# 创建一个学生成绩 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'班级': ['一班', '二班', '一班', '二班', '一班'],
'数学': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 先按班级排序,再按数学成绩排序(都是升序)
df_sorted = df.sort_values(by=['班级', '数学'])
print("先按班级,再按数学成绩排序后:")
print(df_sorted)
print("=" * 50)
# 按班级升序,数学成绩降序
df_sorted2 = df.sort_values(by=['班级', '数学'], ascending=[True, False])
print("按班级升序,数学成绩降序:")
print(df_sorted2)
# 创建一个学生成绩 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'班级': ['一班', '二班', '一班', '二班', '一班'],
'数学': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 先按班级排序,再按数学成绩排序(都是升序)
df_sorted = df.sort_values(by=['班级', '数学'])
print("先按班级,再按数学成绩排序后:")
print(df_sorted)
print("=" * 50)
# 按班级升序,数学成绩降序
df_sorted2 = df.sort_values(by=['班级', '数学'], ascending=[True, False])
print("按班级升序,数学成绩降序:")
print(df_sorted2)
运行结果预期:
原始数据: 姓名 班级 数学 0 张三 一班 85 1 李四 二班 92 2 王五 一班 78 3 赵六 二班 90 4 钱七 一班 88 ================================================== 先按班级,再按数学成绩排序后: 姓名 班级 数学 2 王五 一班 78 0 张三 一班 85 4 钱七 一班 88 3 赵六 二班 90 1 李四 二班 92 ================================================== 按班级升序,数学成绩降序: 姓名 班级 数学 4 钱七 一班 88 0 张三 一班 85 2 王五 一班 78 1 李四 二班 92 3 赵六 二班 90
代码解析:
- 使用列表
by=['班级', '数学']可以按多列排序。 - 先按"班级"排序,一班在前面,二班在后面。
- 在同一班内,再按"数学"成绩排序。
- 使用
ascending=[True, False]可以为不同列指定不同的排序方向。
示例 4:处理缺失值的排序
使用 na_position 参数可以控制缺失值的位置。
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'成绩': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 默认:缺失值放在最后
df_sorted_last = df.sort_values(by='成绩')
print("缺失值放在最后:")
print(df_sorted_last)
print("=" * 50)
# 将缺失值放在最前面
df_sorted_first = df.sort_values(by='成绩', na_position='first')
print("缺失值放在最前:")
print(df_sorted_first)
import numpy as np
# 创建一个包含缺失值的 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'成绩': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 默认:缺失值放在最后
df_sorted_last = df.sort_values(by='成绩')
print("缺失值放在最后:")
print(df_sorted_last)
print("=" * 50)
# 将缺失值放在最前面
df_sorted_first = df.sort_values(by='成绩', na_position='first')
print("缺失值放在最前:")
print(df_sorted_first)
运行结果预期:
原始数据: 姓名 成绩 0 张三 85.0 1 李四 NaN 2 王五 92.0 3 赵六 78.0 ================================================== 缺失值放在最后: 姓名 成绩 3 赵六 78.0 0 张三 85.0 2 王五 92.0 1 李四 NaN ================================================== 缺失值放在最前: 姓名 成绩 1 李四 NaN 3 赵六 78.0 0 张三 85.0 2 王五 92.0
代码解析:
- 默认情况下(
na_position='last'),缺失值排在最后。 - 设置
na_position='first',缺失值排在最前面。
示例 5:重置排序后的索引
排序后索引可能会不连续,可以使用 ignore_index=True 重置索引。
实例
import pandas as pd
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 排序但不重置索引
df_sorted = df.sort_values(by='成绩')
print("排序后(保留原始索引):")
print(df_sorted)
print("=" * 50)
# 排序并重置索引
df_sorted_reset = df.sort_values(by='成绩', ignore_index=True)
print("排序后(重置索引):")
print(df_sorted_reset)
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 排序但不重置索引
df_sorted = df.sort_values(by='成绩')
print("排序后(保留原始索引):")
print(df_sorted)
print("=" * 50)
# 排序并重置索引
df_sorted_reset = df.sort_values(by='成绩', ignore_index=True)
print("排序后(重置索引):")
print(df_sorted_reset)
运行结果预期:
原始数据: 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 ================================================== 排序后(保留原始索引): 姓名 成绩 2 王五 78 0 张三 85 1 李四 92 ================================================== 排序后(重置索引): 姓名 成绩 0 王五 78 1 张三 85 2 李四 92
代码解析:
- 使用
ignore_index=True后,索引重新从 0 开始编号。 - 这在后续需要按索引访问数据时更方便。
示例 6:使用 key 参数自定义排序
key 参数允许在排序前对数据应用自定义函数。
实例
import pandas as pd
# 创建一个包含大小写混合的字符串 DataFrame
data = {
'单词': ['apple', 'Banana', 'cherry', 'APPLE', 'banana']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 按字母升序排序(区分大小写)
df_sorted_case = df.sort_values(by='单词')
print("按字母升序(区分大小写):")
print(df_sorted_case)
print("=" * 50)
# 使用 key 参数实现不区分大小写的排序
df_sorted_nocase = df.sort_values(by='单词', key=lambda x: x.str.lower())
print("按字母升序(不区分大小写):")
print(df_sorted_nocase)
# 创建一个包含大小写混合的字符串 DataFrame
data = {
'单词': ['apple', 'Banana', 'cherry', 'APPLE', 'banana']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 按字母升序排序(区分大小写)
df_sorted_case = df.sort_values(by='单词')
print("按字母升序(区分大小写):")
print(df_sorted_case)
print("=" * 50)
# 使用 key 参数实现不区分大小写的排序
df_sorted_nocase = df.sort_values(by='单词', key=lambda x: x.str.lower())
print("按字母升序(不区分大小写):")
print(df_sorted_nocase)
运行结果预期:
原始数据:
单词
0 apple
1 Banana
2 cherry
3 APPLE
4 banana
==================================================
按字母升序(区分大小写):
单词
3 APPLE
0 apple
1 Banana
4 banana
2 cherry
==================================================
按字母升序(不区分大小写):
单词
0 apple
3 APPLE
1 Banana
4 banana
2 cherry
代码解析:
- 默认排序区分大小写,大写字母排在小写字母前面。
- 使用
key=lambda x: x.str.lower()将所有字符串转为小写后再排序,实现不区分大小写的排序。
示例 7:使用 inplace 参数原地修改
使用 inplace=True 可以直接在原 DataFrame 上修改。
实例
import pandas as pd
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print(f"原始数据 id: {id(df)}")
print("=" * 50)
# 使用 inplace=True 原地排序
df.sort_values(by='成绩', inplace=True)
print("使用 inplace=True 排序后:")
print(df)
print(f"排序后数据 id: {id(df)}")
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print(f"原始数据 id: {id(df)}")
print("=" * 50)
# 使用 inplace=True 原地排序
df.sort_values(by='成绩', inplace=True)
print("使用 inplace=True 排序后:")
print(df)
print(f"排序后数据 id: {id(df)}")
运行结果预期:
原始数据: 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 原始数据 id: 140234567890 ================================================== 使用 inplace=True 排序后: 姓名 成绩 2 王五 78 0 张三 85 1 李四 92 排序后数据 id: 140234567890 # 同一个对象
代码解析:
- 使用
inplace=True后,DataFrame 本身被修改,不再返回新的对象。 - 排序前后的
id相同,说明是同一个对象。 - 这种方法可以节省内存,但会修改原始数据。
注意事项
sort_values()默认返回一个新的 DataFrame,不会修改原始数据。如果想原地修改,使用inplace=True参数。- 排序操作不是原地进行的(除非指定
inplace=True),原始 DataFrame 保持不变。 - 使用
ignore_index=True可以重置索引,这在后续数据处理中会更方便。 key参数非常强大,可以实现各种自定义排序,如不区分大小写、按绝对值排序等。- 多列排序时,
ascending参数可以是列表,与by中的列一一对应。

Pandas 常用函数