Python多列排序技巧:sort_values实用教程
掌握Python数据排序技巧,提升数据分析效率!本文深入解析Pandas库中`sort_values()`函数的实用方法,助你轻松应对单列及多列复合排序需求。通过`by`参数和`ascending`参数,灵活控制排序规则,更有`inplace`和`na_position`参数处理数据修改和缺失值。除了基础用法,文章还介绍了如何创建衍生列进行排序,以及利用`CategoricalDtype`自定义排序顺序,满足复杂业务逻辑。对比Python内置排序函数,`sort_values()`在处理表格数据时更具优势。更有处理缺失值策略,以及通过实际案例,让你快速掌握Python数据排序的精髓,优化数据分析流程。
Pandas的sort_values()函数是Python中处理表格型数据排序的核心工具,其优势在于支持单列或按多列复合排序,例如先按部门升序、再按年龄降序等,使用by参数指定列名列表,ascending参数控制每列的排序方向。此外,sort_values()还提供inplace参数决定是否修改原数据,na_position参数控制缺失值位置,默认为'last',也可设为'first'。对于复杂排序需求,可以通过1.创建衍生列(如字符串长度、计算比率等)进行排序;2.利用CategoricalDtype定义自定义顺序(如绩效等级S>A>B>C),使排序符合业务逻辑。相较Python内置的list.sort()和sorted()函数,sort_values()更适合处理结构化表格数据,具备更强的灵活性和性能优化能力。处理缺失值时,除na_position外,还可通过fillna()填充或dropna()删除缺失值以适应不同分析场景。
Python中要实现数据排序,尤其是处理表格型数据,Pandas库里的sort_values()
函数几乎是我的首选。它不仅能让你对单列数据进行升降序排列,更厉害的是,它能轻松应对多列复合排序的需求,这在数据分析中简直是家常便饭。

当我们谈到Python里对数据进行排序,特别是涉及到像Excel表格那样的数据结构时,Pandas的DataFrame对象自带的sort_values()
方法无疑是最核心的工具。它能让你灵活地控制排序的逻辑。
最直接的用法是单列排序。比如,你有一个数据集,想按某个数值列升序排,直接指定列名就行:df.sort_values(by='你的列名')
。如果想降序,就加个ascending=False
。

但实际工作中,我们经常遇到需要多列共同决定排序顺序的情况。例如,先按部门排序,同一部门内再按年龄排序。这时,sort_values()
的by
参数就可以接收一个列表,里面按优先级顺序放入列名。ascending
参数也同样可以接收一个布尔值列表,对应每一列的升降序要求。
举个例子,假设我们有个员工数据,包含部门
、年龄
和薪资
:

import pandas as pd import numpy as np data = { '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十'], '部门': ['销售部', '研发部', '销售部', '市场部', '研发部', '市场部', '销售部', '研发部'], '年龄': [28, 35, 30, 25, 32, 28, 30, 35], '薪资': [8000, 12000, 9000, 7500, 11000, 8500, 9500, 13000], '绩效等级': ['B', 'A', 'B', 'C', 'A', 'B', 'A', 'S'] } df = pd.DataFrame(data) print("原始数据:") print(df) # 需求:先按部门升序,部门相同则按年龄降序,年龄相同再按薪资升序 df_sorted = df.sort_values(by=['部门', '年龄', '薪资'], ascending=[True, False, True]) print("\n多列排序结果(部门升序,年龄降序,薪资升序):") print(df_sorted) # 另一个常用参数是 `inplace`,如果你想直接修改原DataFrame而不是返回新DataFrame,就设为True。 # 但我个人习惯是先返回一个新DataFrame,这样更安全,方便回溯。 # df.sort_values(by=['部门'], inplace=True) # 还有一个 `na_position` 参数,用来控制缺失值的位置,是放在前面还是后面。 # 默认是'last',也就是缺失值排在最后。
sort_values()
的灵活性在于,它能很好地与Pandas的其他数据操作结合,比如链式操作,或者在分组聚合后进行排序,这些都让数据处理变得异常高效。
Pandas sort_values()
与 Python内置排序函数的区别与应用场景?
谈到排序,Python本身就有list.sort()
和sorted()
这两个内置函数。但它们和Pandas的sort_values()
在设计理念和适用场景上,其实是截然不同的。
list.sort()
是列表对象的一个方法,它会直接在原地修改列表的顺序,不返回任何新列表。它只能对列表这种序列类型的数据进行排序,而且通常是基于列表元素的自然顺序,或者通过key
参数提供一个排序函数。比如:
my_list = [3, 1, 4, 1, 5, 9, 2] my_list.sort() # 列表被修改为 [1, 1, 2, 3, 4, 5, 9] print(my_list) my_strings = ['banana', 'apple', 'cherry'] my_strings.sort(key=len) # 按字符串长度排序 print(my_strings) # ['apple', 'banana', 'cherry']
而sorted()
函数则更为通用,它可以接受任何可迭代对象(列表、元组、字符串、字典的键等),并总是返回一个新的排序后的列表,不会修改原始对象。它也支持key
参数来定义复杂的排序逻辑。
my_tuple = (3, 1, 4) sorted_tuple = sorted(my_tuple) # 返回 [1, 3, 4],原元组不变 print(sorted_tuple) my_dict = {'b': 2, 'a': 1, 'c': 3} sorted_keys = sorted(my_dict.keys()) # 返回 ['a', 'b', 'c'] print(sorted_keys)
那么sort_values()
呢?它专为Pandas的DataFrame和Series设计。它的核心优势在于:
- 处理表格数据: 能够直接对DataFrame的特定列或多列进行排序,保持行与行之间的数据完整性。这是内置排序函数无法直接做到的。
- 丰富的参数: 提供了
by
(指定列)、ascending
(升降序)、inplace
(是否原地修改)、na_position
(缺失值位置)等参数,非常灵活。 - 性能优化: Pandas底层使用C语言实现,对于大规模数据排序,通常比纯Python的排序效率更高。
- 缺失值处理: 内置了对
NaN
(Not a Number)这种缺失值的处理选项,这在实际数据中非常常见。
所以,如果你只是想对一个简单的Python列表或元组进行排序,list.sort()
或sorted()
就足够了。但一旦你的数据是表格形式,需要按多列、有缺失值、或者想保持数据行完整性地排序,那么sort_values()
就是你的不二之选。它更贴合数据分析的场景,能让你用更少的代码做更多的事情。
处理排序中的缺失值(NaN)有哪些策略?
在实际数据中,缺失值(NaN
,Not a Number)是常客。当我们在Pandas DataFrame中进行排序时,这些缺失值的位置就成了一个需要考虑的问题。sort_values()
函数提供了一个很方便的参数来控制它:na_position
。
na_position
参数有两个可选值:
'last'
(默认值):缺失值会被放在排序结果的最后。'first'
:缺失值会被放在排序结果的最前面。
这听起来很简单,但它确实解决了大部分缺失值排序的需求。比如,我们想把所有年龄未知的人(NaN)排在最前面,方便后续处理或识别:
import pandas as pd import numpy as np data_with_nan = { 'ID': [1, 2, 3, 4, 5, 6], '分数': [85, 90, np.nan, 78, np.nan, 92], '等级': ['A', 'A', 'B', 'C', 'B', 'A'] } df_nan = pd.DataFrame(data_with_nan) print("原始数据(含NaN):") print(df_nan) # 按分数排序,NaN排在最前面 df_nan_sorted_first = df_nan.sort_values(by='分数', na_position='first') print("\n按分数排序,NaN在最前:") print(df_nan_sorted_first) # 按分数排序,NaN排在最后(默认行为) df_nan_sorted_last = df_nan.sort_values(by='分数', na_position='last') print("\n按分数排序,NaN在最后:") print(df_nan_sorted_last)
除了使用na_position
,有时我们可能希望在排序前就对缺失值进行预处理,而不是仅仅改变它们的位置。这通常是为了让数据更“干净”,或者为了避免排序结果被NaN影响到逻辑判断。常见的策略包括:
填充缺失值 (
fillna()
):- 用一个固定值填充:比如用0、平均值、中位数等。
- 用前一个或后一个有效值填充 (
ffill()
或bfill()
)。 - 思考: 这种方法的好处是,排序时所有值都是有效的,但缺点是可能会引入人为的偏差,特别是当缺失值很多时。选择填充什么值,需要根据业务场景和数据特性来决定。
# 示例:用0填充分数缺失值,然后排序 df_filled_zero = df_nan.fillna({'分数': 0}) df_filled_zero_sorted = df_filled_zero.sort_values(by='分数') print("\n填充0后排序:") print(df_filled_zero_sorted)
删除缺失值所在行 (
dropna()
):- 如果缺失值所在的行对你的分析不重要,或者缺失值比例很小,直接删除这些行可能是最简单粗暴但有效的方法。
- 思考: 这种方法会减少数据量,可能丢失一些信息。在做这个决定前,务必评估丢失的数据对整体分析的影响。
# 示例:删除分数缺失的行,然后排序 df_dropped_nan = df_nan.dropna(subset=['分数']) df_dropped_nan_sorted = df_dropped_nan.sort_values(by='分数') print("\n删除NaN行后排序:") print(df_dropped_nan_sorted)
选择哪种策略,取决于你的数据特性、缺失值的含义以及你希望排序结果如何反映这些缺失数据。通常,na_position
是快速调整缺失值位置的好方法,而fillna()
或dropna()
则更偏向于数据清洗和准备阶段。
如何根据非直接列或自定义规则进行复杂排序?
有时候,直接按现有列排序并不能满足所有需求。我们可能需要根据某个列的衍生值来排序,或者根据一些非标准的、业务逻辑定义的顺序来排列。这听起来有点复杂,但在Pandas里,我们还是有办法优雅地处理这些情况。
1. 根据衍生列排序:
这种情况是指,你真正想排序的依据,并不是DataFrame中某个现成的列,而是通过现有列计算出来的一个新值。
例如,我们有一个包含字符串的列,但我们想按这些字符串的长度来排序,而不是按字母顺序。一个常见的做法就是先创建一个临时的“长度”列,然后按这个临时列排序,最后再把它删掉。
import pandas as pd data_str = { 'ID': [1, 2, 3, 4, 5], '产品名称': ['Apple iPhone', 'Samsung Galaxy S', 'Google Pixel', 'Xiaomi Redmi', 'OnePlus'] } df_str = pd.DataFrame(data_str) print("原始产品数据:") print(df_str) # 需求:按产品名称的字符串长度排序 # 步骤1:创建临时列 df_str['名称长度'] = df_str['产品名称'].apply(len) # 步骤2:按临时列排序 df_str_sorted_by_len = df_str.sort_values(by='名称长度', ascending=False) # 降序,长的在前 # 步骤3:删除临时列(如果不需要保留的话) df_str_sorted_by_len = df_str_sorted_by_len.drop(columns='名称长度') print("\n按产品名称长度降序排序:") print(df_str_sorted_by_len)
这种方法非常灵活,你可以用apply()
结合任何自定义函数来创建衍生列,比如计算某个比率、提取日期中的年份、或者对文本进行某种模式匹配后的结果等。
2. 根据自定义(非自然)顺序排序(分类数据排序):
这是在实际业务中非常常见的一个场景。比如,我们有一个“绩效等级”列,内容是'S', 'A', 'B', 'C'。如果直接排序,Python会按字母顺序排成'A', 'B', 'C', 'S',但这显然不符合我们“S > A > B > C”的业务逻辑。
Pandas为此提供了一个非常强大的数据类型:CategoricalDtype
。你可以定义分类的顺序,然后Pandas就会按照你指定的顺序进行排序。这比手动映射成数字再排序要优雅和健壮得多。
import pandas as pd data_perf = { '员工': ['张三', '李四', '王五', '赵六', '钱七'], '绩效等级': ['B', 'A', 'S', 'C', 'A'] } df_perf = pd.DataFrame(data_perf) print("原始绩效数据:") print(df_perf) # 定义自定义排序顺序 performance_order = ['C', 'B', 'A', 'S'] # 将'绩效等级'列转换为有序的Categorical类型 df_perf['绩效等级'] = pd.Categorical(df_perf['绩效等级'], categories=performance_order, ordered=True) # 现在直接按'绩效等级'排序,就会按照我们定义的顺序来 df_perf_sorted = df_perf.sort_values(by='绩效等级', ascending=True) # 这里ascending=True表示按我们定义的顺序从小到大排 print("\n按自定义绩效等级顺序排序:") print(df_perf_sorted)
通过pd.Categorical
,我们给Pandas提供了一个“字典”,告诉它'C'比'B'小,'B'比'A'小,以此类推。这样,无论列中出现什么值,只要在categories
中定义了,排序时都会按照这个内部顺序来。这对于处理像月份(Jan, Feb, Mar...)、产品尺寸(S, M, L, XL)等非字母/数字自然顺序的分类数据非常有用。
这两种方法——创建衍生列和利用分类数据类型——覆盖了大部分复杂排序的需求。它们都体现了Pandas在数据处理上的强大和灵活性,能让你更好地控制数据的呈现方式,使其符合你的分析目的或业务逻辑。
到这里,我们也就讲完了《Python多列排序技巧:sort_values实用教程》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

- 上一篇
- Java响应式编程背压处理技巧

- 下一篇
- AI武术教学搭配豆包,实战学习全攻略
-
- 文章 · python教程 | 25分钟前 |
- PythonPyQt计算器开发教程实战详解
- 369浏览 收藏
-
- 文章 · python教程 | 40分钟前 |
- Python网络分析:networkx图论实战应用
- 275浏览 收藏
-
- 文章 · python教程 | 45分钟前 |
- PyCharm安装教程图文详细步骤
- 373浏览 收藏
-
- 文章 · python教程 | 58分钟前 |
- Python卫星图像处理教程:rasterio入门指南
- 411浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python连接MongoDB教程:pymongo使用指南
- 282浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python中int类型详解及用法
- 229浏览 收藏
-
- 文章 · python教程 | 1小时前 | 异步编程 asyncio 事件循环 async/await Python协程
- Python协程是什么?异步编程入门详解
- 460浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- JupyterNotebook导入模块常见问题解析
- 438浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- CodeWhisperer
- Amazon CodeWhisperer,一款AI代码生成工具,助您高效编写代码。支持多种语言和IDE,提供智能代码建议、安全扫描,加速开发流程。
- 6次使用
-
- 畅图AI
- 探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
- 31次使用
-
- TextIn智能文字识别平台
- TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
- 40次使用
-
- 简篇AI排版
- SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
- 35次使用
-
- 小墨鹰AI快排
- SEO 小墨鹰 AI 快排,新媒体运营必备!30 秒自动完成公众号图文排版,更有 AI 写作助手、图片去水印等功能。海量素材模板,一键秒刷,提升运营效率!
- 34次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览