现在位置: 首页 > Pandas 教程 > 正文

Pandas df.sort_values() 函数

Pandas 常用函数 Pandas 常用函数


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)

运行结果预期:

原始数据:
   姓名  数学  英语
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

代码解析:

  1. 默认的排序方式是升序(从小到大)。
  2. 数学成绩 78 分排在最前面,92 分排在最后面。
  3. 排序后索引保持不变(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)

运行结果预期:

原始数据:
   姓名  数学  英语
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)

运行结果预期:

原始数据:
   姓名  班级  数学
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)

运行结果预期:

原始数据:
   姓名   成绩
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)

运行结果预期:

原始数据:
   姓名  成绩
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)

运行结果预期:

原始数据:
    单词
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)}")

运行结果预期:

原始数据:
   姓名  成绩
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 常用函数 Pandas 常用函数