当前位置:首页 > 文章列表 > 文章 > python教程 > Python多列排序技巧:sort_values实用教程

Python多列排序技巧:sort_values实用教程

2025-07-18 16:05:24 0浏览 收藏

掌握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怎样实现数据排序?sort_values多列排序

Python中要实现数据排序,尤其是处理表格型数据,Pandas库里的sort_values()函数几乎是我的首选。它不仅能让你对单列数据进行升降序排列,更厉害的是,它能轻松应对多列复合排序的需求,这在数据分析中简直是家常便饭。

Python怎样实现数据排序?sort_values多列排序

当我们谈到Python里对数据进行排序,特别是涉及到像Excel表格那样的数据结构时,Pandas的DataFrame对象自带的sort_values()方法无疑是最核心的工具。它能让你灵活地控制排序的逻辑。

最直接的用法是单列排序。比如,你有一个数据集,想按某个数值列升序排,直接指定列名就行:df.sort_values(by='你的列名')。如果想降序,就加个ascending=False

Python怎样实现数据排序?sort_values多列排序

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

举个例子,假设我们有个员工数据,包含部门年龄薪资

Python怎样实现数据排序?sort_values多列排序
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设计。它的核心优势在于:

  1. 处理表格数据: 能够直接对DataFrame的特定列或多列进行排序,保持行与行之间的数据完整性。这是内置排序函数无法直接做到的。
  2. 丰富的参数: 提供了by(指定列)、ascending(升降序)、inplace(是否原地修改)、na_position(缺失值位置)等参数,非常灵活。
  3. 性能优化: Pandas底层使用C语言实现,对于大规模数据排序,通常比纯Python的排序效率更高。
  4. 缺失值处理: 内置了对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影响到逻辑判断。常见的策略包括:

  1. 填充缺失值 (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)
  2. 删除缺失值所在行 (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响应式编程背压处理技巧Java响应式编程背压处理技巧
上一篇
Java响应式编程背压处理技巧
AI武术教学搭配豆包,实战学习全攻略
下一篇
AI武术教学搭配豆包,实战学习全攻略
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • AI代码助手:Amazon CodeWhisperer,高效安全的代码生成工具
    CodeWhisperer
    Amazon CodeWhisperer,一款AI代码生成工具,助您高效编写代码。支持多种语言和IDE,提供智能代码建议、安全扫描,加速开发流程。
    6次使用
  • 畅图AI:AI原生智能图表工具 | 零门槛生成与高效团队协作
    畅图AI
    探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
    31次使用
  • TextIn智能文字识别:高效文档处理,助力企业数字化转型
    TextIn智能文字识别平台
    TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
    40次使用
  • SEO  简篇 AI 排版:3 秒生成精美文章,告别排版烦恼
    简篇AI排版
    SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
    35次使用
  • SEO  小墨鹰 AI 快排:公众号图文排版神器,30 秒搞定精美排版
    小墨鹰AI快排
    SEO 小墨鹰 AI 快排,新媒体运营必备!30 秒自动完成公众号图文排版,更有 AI 写作助手、图片去水印等功能。海量素材模板,一键秒刷,提升运营效率!
    34次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码