查看全课大纲(第 44 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

排序操作

约 11 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析中,排序是一项基础且重要的数据整理操作。通过排序,我们可以清晰地观察数据在某一列或某一行上的分布趋势,快速找到最大值、最小值,或者按照特定逻辑(如地区、时间)组织数据。本节将学习在 Pandas 中如何按索引和按值对 DataFrame 进行排序,包括单列排序和多列排序。

💡 核心导读

  • 按索引排序:使用 sort_index() 方法,可指定按行索引或列索引排序,以及升序或降序。
  • 按值排序:使用 sort_values() 方法,核心参数是 by(指定排序列)和 ascending(指定排序方向)。
  • 单列与多列排序:by 参数可以接收单个列名或多个列名组成的列表,实现分组排序。
  • 排序方向控制:ascending 参数可以是一个布尔值(控制所有列)或一个布尔值列表(为每列指定不同方向)。

按索引排序:sort_index()

索引(Index)是 Pandas 数据结构的标签。当索引本身具有业务含义(如国家名、排名、日期)时,我们可以直接对索引进行排序。

sort_index() 方法用于按索引排序。对于 DataFrame,索引有两个方向:行索引(axis=0,默认)和列索引(axis=1)。ascending 参数控制排序方向,True 为升序(默认),False 为降序。

按行索引排序

我们首先构造一个模拟的“世界幸福指数”数据集进行演示。

import pandas as pd

# 构造模拟数据集:国家、地区、幸福指数得分
data = {
    'Country': ['Denmark', 'Switzerland', 'Iceland', 'Norway', 'Finland',
                'Canada', 'Netherlands', 'New Zealand', 'Australia', 'Sweden'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe',
               'North America', 'Western Europe', 'Australia and New Zealand', 'Australia and New Zealand', 'Western Europe'],
    'Happiness Score': [7.526, 7.509, 7.501, 7.498, 7.413,
                        7.404, 7.339, 7.334, 7.313, 7.291]
}
# 使用一个从1开始的整数序列作为行索引,模拟“幸福排名”
df = pd.DataFrame(data, index=pd.Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name='Happiness Rank'))
print("原始数据:")
print(df)
原始数据:
                    Country                     Region  Happiness Score
Happiness Rank
1                   Denmark             Western Europe            7.526
2               Switzerland             Western Europe            7.509
3                   Iceland             Western Europe            7.501
4                    Norway             Western Europe            7.498
5                   Finland             Western Europe            7.413
6                    Canada              North America            7.404
7               Netherlands             Western Europe            7.339
8               New Zealand  Australia and New Zealand            7.334
9                 Australia  Australia and New Zealand            7.313
10                   Sweden             Western Europe            7.291

默认情况下,sort_index() 按行索引升序排列。如果我们想查看排名最低(即最不幸福)的国家,可以按行索引降序排列。

import pandas as pd

# 重新构造数据,确保自包含
data = {
    'Country': ['Denmark', 'Switzerland', 'Iceland', 'Norway', 'Finland',
                'Canada', 'Netherlands', 'New Zealand', 'Australia', 'Sweden'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe',
               'North America', 'Western Europe', 'Australia and New Zealand', 'Australia and New Zealand', 'Western Europe'],
    'Happiness Score': [7.526, 7.509, 7.501, 7.498, 7.413,
                        7.404, 7.339, 7.334, 7.313, 7.291]
}
df = pd.DataFrame(data, index=pd.Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name='Happiness Rank'))

# 按行索引降序排列,查看排名靠后的国家
df_sorted_index_desc = df.sort_index(ascending=False)
print("按行索引降序排列(前5行):")
print(df_sorted_index_desc.head())
按行索引降序排列(前5行):
                    Country                     Region  Happiness Score
Happiness Rank
10                   Sweden             Western Europe            7.291
9                 Australia  Australia and New Zealand            7.313
8               New Zealand  Australia and New Zealand            7.334
7               Netherlands             Western Europe            7.339
6                    Canada              North America            7.404

按列索引排序

通过设置 axis=1,sort_index() 会对列名(即列索引)进行排序。这对于整理列的顺序非常有用,特别是当列名是字符串时,会按照字母顺序排列。

import pandas as pd

# 重新构造数据,确保自包含
data = {
    'Country': ['Denmark', 'Switzerland'],
    'Region': ['Western Europe', 'Western Europe'],
    'Happiness Score': [7.526, 7.509]
}
df = pd.DataFrame(data, index=[1, 2])

# 按列名(列索引)升序排列
df_sorted_columns = df.sort_index(axis=1)
print("按列名升序排列:")
print(df_sorted_columns.head())
按列名升序排列:
       Country  Happiness Score          Region
1      Denmark            7.526  Western Europe
2  Switzerland            7.509  Western Europe

原始列顺序是 ['Country', 'Region', 'Happiness Score']。按字母顺序排序后,顺序变为 ['Country', 'Happiness Score', 'Region'],因为 ‘C’ < ‘H’ < ‘R’。若设置 ascending=False,则顺序会反过来。

按值排序:sort_values()

更多时候,我们需要根据数据列(值)的内容进行排序,例如按分数高低、按字母顺序等。这时需要使用 sort_values() 方法。

单列排序

sort_values() 的核心参数是 by,用于指定依据哪一列的值进行排序。

import pandas as pd

# 重新构造数据,确保自包含
data = {
    'Country': ['Sweden', 'Denmark', 'Norway', 'Finland', 'Iceland'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe'],
    'Happiness Score': [7.291, 7.526, 7.498, 7.413, 7.501]
}
df = pd.DataFrame(data)

# 按'Country'列升序排序(字符串按字母顺序)
df_sorted_by_country = df.sort_values(by='Country')
print("按'Country'列升序排序:")
print(df_sorted_by_country)
按'Country'列升序排序:
   Country          Region  Happiness Score
1  Denmark  Western Europe            7.526
3  Finland  Western Europe            7.413
4  Iceland  Western Europe            7.501
2   Norway  Western Europe            7.498
0   Sweden  Western Europe            7.291

如果按数值列排序,例如按幸福指数得分降序排列,可以快速找出最幸福的国家。

import pandas as pd

# 重新构造数据,确保自包含
data = {
    'Country': ['Sweden', 'Denmark', 'Norway', 'Finland', 'Iceland'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe'],
    'Happiness Score': [7.291, 7.526, 7.498, 7.413, 7.501]
}
df = pd.DataFrame(data)

# 按'Happiness Score'列降序排序,查看最幸福的国家
df_sorted_by_score_desc = df.sort_values(by='Happiness Score', ascending=False)
print("按'Happiness Score'列降序排序(查看最幸福的国家):")
print(df_sorted_by_score_desc)
按'Happiness Score'列降序排序(查看最幸福的国家):
   Country          Region  Happiness Score
1  Denmark  Western Europe            7.526
4  Iceland  Western Europe            7.501
2   Norway  Western Europe            7.498
3  Finland  Western Europe            7.413
0   Sweden  Western Europe            7.291

多列排序

在实际分析中,我们经常需要先按一个维度分组,再在组内按另一个维度排序。例如,先按地区(Region)排序,然后在同一地区内按国家(Country)排序。这可以通过在 by 参数中传入一个列名列表来实现。

ascending 参数也可以对应地传入一个布尔值列表,为每一列指定排序方向。

import pandas as pd

# 重新构造包含多个地区的数据,确保自包含
data = {
    'Country': ['Australia', 'New Zealand', 'Albania', 'Armenia', 'Austria', 'Belgium'],
    'Region': ['Australia and New Zealand', 'Australia and New Zealand',
               'Central and Eastern Europe', 'Central and Eastern Europe',
               'Western Europe', 'Western Europe'],
    'Happiness Score': [7.313, 7.334, 4.959, 4.350, 7.200, 6.937]
}
df = pd.DataFrame(data)

# 多列排序:先Region升序,再Country升序
df_sorted_multi = df.sort_values(by=['Region', 'Country'])
print("多列排序:先按Region升序,再按Country升序:")
print(df_sorted_multi)
多列排序:先按Region升序,再按Country升序:
       Country                      Region  Happiness Score
0    Australia   Australia and New Zealand            7.313
1  New Zealand   Australia and New Zealand            7.334
2      Albania  Central and Eastern Europe            4.959
3      Armenia  Central and Eastern Europe            4.350
4      Austria              Western Europe            7.200
5      Belgium              Western Europe            6.937

排序逻辑是:首先整个 DataFrame 按照 Region 列的字母顺序升序排列(‘Australia and New Zealand’ 在 ‘Central and Eastern Europe’ 之前,后者又在 ‘Western Europe’ 之前)。然后,在同一个 Region 分组内,再按照 Country 列的字母顺序升序排列(在 ‘Australia and New Zealand’ 组内,‘Australia’ 在 ‘New Zealand’ 之前)。

我们还可以为不同的列指定不同的排序方向。

import pandas as pd

# 重新构造包含多个地区的数据,确保自包含
data = {
    'Country': ['Australia', 'New Zealand', 'Albania', 'Armenia', 'Austria', 'Belgium'],
    'Region': ['Australia and New Zealand', 'Australia and New Zealand',
               'Central and Eastern Europe', 'Central and Eastern Europe',
               'Western Europe', 'Western Europe'],
    'Happiness Score': [7.313, 7.334, 4.959, 4.350, 7.200, 6.937]
}
df = pd.DataFrame(data)

# 多列排序:Region升序,Country降序
df_sorted_multi_diff = df.sort_values(by=['Region', 'Country'], ascending=[True, False])
print("多列排序:Region升序,Country降序:")
print(df_sorted_multi_diff)
多列排序:Region升序,Country降序:
       Country                      Region  Happiness Score
1  New Zealand   Australia and New Zealand            7.334
0    Australia   Australia and New Zealand            7.313
3      Armenia  Central and Eastern Europe            4.350
2      Albania  Central and Eastern Europe            4.959
5      Belgium              Western Europe            6.937
4      Austria              Western Europe            7.200

此时,Region 仍然是升序排列。但在每个 Region 分组内部,Country 是按字母顺序降序排列的。例如在 ‘Australia and New Zealand’ 组内,‘New Zealand’(N)排在 ‘Australia’(A)之前。

📝 动手练一练

  1. 概念辨析:sort_index(axis=1) 和 sort_values(by='Country') 分别对数据的哪个部分进行排序?它们产生的效果有何本质区别?
👉 点击查看参考答案
  • sort_index(axis=1) 是对 DataFrame 的列索引(即列名)进行排序。它改变的是列在表格中从左到右的显示顺序,而不改变每行数据的内容。例如,列名 ['B', 'A', 'C'] 排序后会变成 ['A', 'B', 'C']。
  • sort_values(by='Country') 是根据名为 'Country' 的这一数据列的值进行排序。它改变的是行在表格中从上到下的顺序,每一行数据(包含所有列)作为一个整体被移动。例如,按国家名字母顺序排序后,'Canada' 所在的行会移动到 'Denmark' 所在行之前。
  • 本质区别:前者排序的是标签(索引),后者排序的是数据(值)。
  1. 动手实算:使用下面提供的小数据集,编写代码实现:先按 'Department' 升序排列,再在同一个部门内按 'Salary' 降序排列。观察排序结果是否符合“组内按工资高低排名”的预期。
import pandas as pd
data_ex = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Department': ['HR', 'Engineering', 'HR', 'Engineering', 'Marketing'],
    'Salary': [50000, 80000, 55000, 75000, 60000]
}
df_ex = pd.DataFrame(data_ex)
# 请在此处编写你的排序代码
👉 点击查看参考答案
import pandas as pd
data_ex = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Department': ['HR', 'Engineering', 'HR', 'Engineering', 'Marketing'],
    'Salary': [50000, 80000, 55000, 75000, 60000]
}
df_ex = pd.DataFrame(data_ex)

# 多列排序:Department升序,Salary降序
result = df_ex.sort_values(by=['Department', 'Salary'], ascending=[True, False])
print(result)

输出结果:

      Name   Department  Salary
1      Bob  Engineering   80000
3    David  Engineering   75000
2  Charlie           HR   55000
0    Alice           HR   50000
4      Eva    Marketing   60000

结果符合预期:首先部门按字母顺序排列(Engineering, HR, Marketing)。在 Engineering 部门内,Bob 工资最高排第一;在 HR 部门内,Charlie 工资更高排第一。

本章小结

本节我们系统学习了 Pandas 中的两种排序操作:按索引排序和按值排序。排序是数据整理和初步探索的关键步骤,能帮助我们快速理解数据分布、定位极端值以及按照业务逻辑组织数据。

📋 行动清单

  • 掌握核心方法:记住 sort_index() 用于索引排序,sort_values() 用于值排序,并清楚它们的核心参数。
  • 练习多列排序:尝试在自有数据集或练习数据上,使用多列排序实现“先分组,后组内排序”的常见需求。
  • 明确排序对象:在应用排序前,先想清楚是要对行/列标签排序,还是要根据某一列的数据值排序,从而选择正确的方法。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:排序操作
    PDF · 245KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载