当前位置:

首页 > 编程开发 > PandasDataFrame中两种排序函数的使用

PandasDataFrame中两种排序函数的使用

本文目录

    Pandas中DataFrame排序主要使用sort_values()按列值排序和sort_index()按索引排序。sort_values()支持单列或多列排序,可指定升序降序、缺失值位置及重置索引。sort_index()可按行或列索引排序,通过key参数实现自定义排序规则。

    做数据分析的朋友都知道,Pandas里DataFrame的排序是日常高频操作。看似简单,但真要处理多列排序、缺失值定位、自定义规则这些场景时,稍不留神就容易踩坑。今天咱们就把这块彻底理清楚。

    一、排序的核心函数:sort_values()和sort_index()

    DataFrame的排序主要依赖两个核心函数,先明确它们的定位:

    PandasDataFrame中两种排序函数的使用

    函数核心作用适用场景
    sort_values()按列的值排序(最常用)按分数、日期、金额等业务字段排序
    sort_index()按行/列索引排序按行标签(如学号、日期)或列名排序

    通用参数(两个函数都支持)

    参数作用常用值
    ascending升序/降序True(升序,默认)/False(降序)
    inplace是否修改原 DataFrameFalse(返回新对象,默认)/True(原地修改)
    na_position缺失值(NaN)的位置last(默认,放最后)/first(放最前)
    ignore_index是否重置行索引(0,1,2...)False(保留原索引,默认)/True(重置)

    二、核心排序:按列值排序(sort_values())

    这是实战中最常用的排序方式,支持单列、多列、自定义排序规则。下面一个个拆解。

    1. 单列排序(基础)

    import pandas as pd
    import numpy as np
    # 构建示例数据(学生成绩)
    data = {
        "姓名": ["小明", "小红", "小刚", "小丽", "小强"],
        "班级": ["1班", "2班", "1班", "2班", "1班"],
        "数学": [85, 92, 78, 90, np.nan],  # 含缺失值
        "语文": [92, 88, 80, 85, 90]
    }
    df = pd.DataFrame(data, index=["stu01", "stu02", "stu03", "stu04", "stu05"])
    print("原始DataFrame:")
    print(df)
    # 1.1 按「数学」列升序排序(默认)
    df_sort_math_asc = df.sort_values(by="数学")
    print("\n按数学升序排序(缺失值放最后):")
    print(df_sort_math_asc)
    # 1.2 按「数学」列降序排序,缺失值放最前
    df_sort_math_desc = df.sort_values(by="数学", ascending=False, na_position="first")
    print("\n按数学降序排序(缺失值放最前):")
    print(df_sort_math_desc)
    # 1.3 原地排序(修改原DataFrame)+ 重置行索引
    df.sort_values(by="语文", ascending=False, inplace=True, ignore_index=True)
    print("\n按语文降序原地排序(重置索引):")
    print(df)

    关键说明:

    • by="列名" 是必传参数,指定排序依据的列;
    • na_position 仅对含 NaN 的列有效,默认 last(缺失值放最后);
    • ignore_index=True 会将排序后的行索引重置为 0,1,2...,避免原索引混乱。

    2. 多列排序(进阶)

    按多个列依次排序(先按第一列,第一列值相同则按第二列),适用于“分组排序”场景。比如先按班级,再按数学成绩。

    import pandas as pd
    # 重置示例数据
    data = {
        "姓名": ["小明", "小红", "小刚", "小丽", "小强", "小芳"],
        "班级": ["1班", "2班", "1班", "2班", "1班", "2班"],
        "数学": [85, 92, 85, 90, 88, 92],
        "语文": [92, 88, 80, 85, 90, 82]
    }
    df = pd.DataFrame(data)
    print("原始DataFrame:")
    print(df)
    # 2.1 先按「班级」升序,再按「数学」降序排序
    df_sort_multi = df.sort_values(
        by=["班级", "数学"],  # 排序列(先班级,后数学)
        ascending=[True, False]  # 对应列的排序方向(班级升序,数学降序)
    )
    print("\n按班级升序、数学降序排序:")
    print(df_sort_multi)
    # 2.2 多列排序+重置索引
    df_sort_multi_reset = df.sort_values(
        by=["班级", "语文"],
        ascending=[True, True],
        ignore_index=True
    )
    print("\n按班级升序、语文升序排序(重置索引):")
    print(df_sort_multi_reset)

    核心逻辑:

    • by 传入列名列表,排序优先级从左到右;
    • ascending 传入布尔值列表,与 by 的列一一对应(数量必须相等)。

    3. 按字符串列排序(特殊场景)

    支持按字符串的字母/汉字顺序排序,可结合字符串方法增强灵活性。比如按姓名排序,或者按城市分组后再按分数排。

    import pandas as pd
    data = {
        "姓名": ["张三", "李四", "王五", "赵六", "钱七"],
        "城市": ["北京", "上海", "广州", "深圳", "北京"],
        "分数": [85, 92, 78, 90, 88]
    }
    df = pd.DataFrame(data)
    print("原始DataFrame:")
    print(df)
    # 3.1 按「姓名」字符串排序(汉字拼音顺序)
    df_sort_name = df.sort_values(by="姓名")
    print("\n按姓名字符串排序:")
    print(df_sort_name)
    # 3.2 按「城市」升序,再按「分数」降序
    df_sort_city_score = df.sort_values(by=["城市", "分数"], ascending=[True, False])
    print("\n按城市升序、分数降序排序:")
    print(df_sort_city_score)
    # 3.3 按字符串长度排序(需自定义key)
    df["姓名长度"] = df["姓名"].str.len()
    df_sort_len = df.sort_values(by="姓名长度")
    print("\n按姓名长度排序:")
    print(df_sort_len)

    三、按索引排序(sort_index())

    分为「按行索引排序」和「按列索引(列名)排序」,适用于索引有业务含义的场景(如日期索引、学号索引)。

    1. 按行索引排序

    import pandas as pd
    # 构建带自定义行索引的DataFrame
    data = {
        "数学": [85, 92, 78, 90],
        "语文": [92, 88, 80, 85]
    }
    df = pd.DataFrame(data, index=["stu03", "stu01", "stu04", "stu02"])
    print("原始DataFrame(行索引混乱):")
    print(df)
    # 1.1 按行索引升序排序(默认)
    df_sort_idx_asc = df.sort_index()
    print("\n按行索引升序排序:")
    print(df_sort_idx_asc)
    # 1.2 按行索引降序排序
    df_sort_idx_desc = df.sort_index(ascending=False)
    print("\n按行索引降序排序:")
    print(df_sort_idx_desc)

    2. 按列名排序

    通过 axis=1 指定按列索引(列名)排序,适用于列名较多且需规范顺序的场景。比如把“姓名”、“班级”这样的列名按字母顺序排列。

    import pandas as pd
    # 构建列名混乱的DataFrame
    data = {
        "语文": [92, 88, 80],
        "班级": ["1班", "2班", "1班"],
        "数学": [85, 92, 78],
        "姓名": ["小明", "小红", "小刚"]
    }
    df = pd.DataFrame(data)
    print("原始DataFrame(列名混乱):")
    print(df)
    # 按列名升序排序(axis=1)
    df_sort_cols = df.sort_index(axis=1)
    print("\n按列名升序排序:")
    print(df_sort_cols)
    # 按列名降序排序
    df_sort_cols_desc = df.sort_index(axis=1, ascending=False)
    print("\n按列名降序排序:")
    print(df_sort_cols_desc)

    关键参数:

    • axis=0(默认):按行索引排序;
    • axis=1:按列索引(列名)排序。

    四、进阶排序技巧

    1. 按自定义规则排序(key参数)

    sort_values() 的 key 参数支持传入自定义函数,实现非默认排序逻辑(如按字符串首字母、数值的绝对值排序)。这招在需要“特殊规则”时特别好用。

    import pandas as pd
    import numpy as np
    data = {
        "姓名": ["Alice", "Bob", "Charlie", "Da vid"],
        "分数": [85, -92, 78, -90],
        "等级": ["B", "A", "C", "A"]
    }
    df = pd.DataFrame(data)
    print("原始DataFrame:")
    print(df)
    # 1.1 按分数的绝对值降序排序
    df_sort_abs = df.sort_values(by="分数", key=lambda x: x.abs(), ascending=False)
    print("\n按分数绝对值降序排序:")
    print(df_sort_abs)
    # 1.2 按姓名首字母小写排序
    df_sort_name_lower = df.sort_values(by="姓名", key=lambda x: x.str.lower())
    print("\n按姓名首字母小写排序:")
    print(df_sort_name_lower)
    # 1.3 按自定义等级规则排序(A>B>C)
    grade_order = {"A": 1, "B": 2, "C": 3}
    df_sort_grade = df.sort_values(by="等级", key=lambda x: x.map(grade_order))
    print("\n按等级规则(A>B>C)排序:")
    print(df_sort_grade)

    2. 按行值排序(横向排序)

    默认排序是“纵向”(按列值排行),如需“横向”(按行值排列),需结合 apply 和 sort_values。比如每个学生各科成绩,想按分数从高到低排列各科。

    import pandas as pd
    # 构建每行是学生、每列是科目的DataFrame
    data = {
        "数学": [85, 92, 78],
        "语文": [92, 88, 80],
        "英语": [88, 90, 85]
    }
    df = pd.DataFrame(data, index=["小明", "小红", "小刚"])
    print("原始DataFrame(每行是学生,每列是科目):")
    print(df)
    # 按每行的值降序排序(横向排序,即每个学生的科目按分数从高到低排)
    df_sort_row = df.apply(lambda x: x.sort_values(ascending=False).values, axis=1)
    # 重置列名(保持原列名顺序,仅值排序)
    df_sort_row.columns = df.columns
    print("\n按每行分数降序排序(横向):")
    print(df_sort_row)

    3. 排序后保留/删除重复值

    排序后结合 drop_duplicates() 实现“保留每组最大值/最小值”的场景。比如每个班级只保留数学成绩最高的学生。

    import pandas as pd
    data = {
        "班级": ["1班", "1班", "2班", "2班", "1班"],
        "数学": [85, 92, 78, 90, 88],
        "姓名": ["小明", "小红", "小刚", "小丽", "小强"]
    }
    df = pd.DataFrame(data)
    print("原始DataFrame:")
    print(df)
    # 按班级分组,保留每个班级数学分数最高的学生
    # 步骤1:按班级升序、数学降序排序
    df_sort = df.sort_values(by=["班级", "数学"], ascending=[True, False])
    # 步骤2:按班级去重,保留第一个(即分数最高的)
    df_top1 = df_sort.drop_duplicates(subset=["班级"], keep="first")
    print("\n每个班级数学最高分学生:")
    print(df_top1)

    五、实战场景:排序的典型应用

    时间序列数据排序

    拿到一份日期混乱的温度数据,第一件事就是按日期索引恢复顺序,然后可能会按温度降序找极端值。

    import pandas as pd
    import numpy as np
    # 构建日期索引混乱的温度数据
    dates = pd.date_range("2026-01-01", periods=5)
    np.random.shuffle(dates)  # 打乱日期
    data = {
        "温度": np.random.normal(5, 3, 5).round(1),
        "湿度": np.random.uniform(30, 80, 5).round(1)
    }
    df = pd.DataFrame(data, index=dates)
    print("原始时间序列数据(日期混乱):")
    print(df)
    # 按日期索引升序排序(恢复时间顺序)
    df_sort_date = df.sort_index()
    print("\n按日期升序排序:")
    print(df_sort_date)
    # 按温度降序排序,保留日期索引
    df_sort_temp = df.sort_values(by="温度", ascending=False)
    print("\n按温度降序排序:")
    print(df_sort_temp)

    六、避坑点与最佳实践

    1. 核心避坑点

    • ❌ 多列排序时 ascending 数量不匹配:by=["A","B"] 必须对应 ascending=[True, False](2个值);
    • ❌ 混淆 axis 参数:按列名排序需设 axis=1,默认 axis=0 是按行索引;
    • ❌ 忽略缺失值位置:含 NaN 的列排序时,NaN 默认放最后,需调整 na_position 时忘记设置;
    • ❌ 原地排序后索引混乱:未加 ignore_index=True,导致排序后行索引还是原混乱索引;
    • ❌ 自定义 key 函数错误:key 需返回与原列长度相同的数组(如 lambda x: x.abs()),而非单个值。

    2. 最佳实践

    • ✅ 优先用 sort_values() 按业务列排序,sort_index() 按索引排序;
    • ✅ 多列排序时,先排分组列(如班级),后排业务列(如分数);
    • ✅ 排序后重置索引:重要分析结果建议加 ignore_index=True,避免索引混乱;
    • ✅ 自定义排序用 key 参数:避免手动修改数据后排序,保持代码简洁;
    • ✅ 大数据集排序:先筛选需要的列(usecols),再排序,提升效率。

    总结

    1. DataFrame 排序核心依赖两个函数:
      • sort_values(by=列名):按列值排序(单列/多列),支持 ascending/na_position/key;
      • sort_index(axis=0/1):按行/列索引排序,适用于索引有业务含义的场景;
    2. 核心参数:
      • by:指定排序列(仅 sort_values 需传);
      • ascending:排序方向(True = 升序,False = 降序);
      • ignore_index:排序后重置行索引(推荐开启);
      • axis:按行/列索引排序(仅 sort_index 需传);
    3. 进阶技巧:
      • 自定义规则用 key 参数(如绝对值、字符串处理);
      • 横向排序用 apply(axis=1);
      • 分组取最值:排序 + drop_duplicates();
    4. 避坑关键:多列排序时 ascending 数量匹配,含缺失值时指定 na_position,排序后重置索引。
    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。