查看全课大纲(第 58 / 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.实战:通过移动设备行为数据预测性别和年龄

透视表操作

约 9 分钟

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

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

在数据分析中,我们常常需要从不同维度观察数据的聚合结果。本节课将介绍如何使用Pandas的pivot_table方法,将扁平的二维表格数据,转换为一个结构清晰、便于对比的“立体”透视表,从而高效地进行多维度分析。

💡 核心导读

  • 透视表的作用:将数据按行、列分组,并对指定数值进行聚合,实现数据从“扁平”到“立体”的转换。
  • pivot_table核心参数:values(聚合值)、index(行索引)、columns(列索引)、aggfunc(聚合函数)、margins(边际汇总)。
  • 多聚合函数应用:可以一次性计算均值、最大值、最小值等多种聚合指标。
  • 实战应用:通过模拟电动汽车电池容量数据,演示透视表在趋势分析中的直观作用。

透视表的基本概念与参数

透视表(Pivot Table)是一种数据汇总工具,它允许你重新排列、聚合和呈现数据。在Pandas中,DataFrame.pivot_table()方法是实现此功能的核心。

其核心参数如下:

  • values:指定要进行聚合计算的数值列。这是我们最终关心的数据。
  • index:指定透视表中作为行索引的列。这些列的唯一值将成为透视表的行。
  • columns:指定透视表中作为列索引的列。这些列的唯一值将成为透视表的列。
  • aggfunc:聚合函数。默认是'mean'(求平均值),也可以是'sum'(求和)、'max'(最大值)、'min'(最小值)等。可以传入一个函数列表来同时进行多种聚合计算。
  • margins:布尔值,默认为False。若设为True,则会添加行和列的边际汇总(即“总计”行和列)。

基础透视表操作

让我们通过一个学生成绩的例子来学习透视表的基本用法。我们将创建一个包含学生姓名、学期、科目和分数的数据集。

import pandas as pd
import numpy as np

# 构造学生成绩数据
student_data = {
    'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine',
             'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine'],
    'Semester': ['Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1',
                 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2'],
    'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science',
                'Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science'],
    'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 67, 89, 81]
}
df = pd.DataFrame(student_data)
print("原始学生成绩数据:")
print(df)
原始学生成绩数据:
        Name    Semester      Subject  Score
0      Alisa  Semester 1  Mathematics     62
1      Bobby  Semester 1  Mathematics     47
2   Cathrine  Semester 1  Mathematics     55
3      Alisa  Semester 1      Science     74
4      Bobby  Semester 1      Science     31
5   Cathrine  Semester 1      Science     77
6      Alisa  Semester 2  Mathematics     85
7      Bobby  Semester 2  Mathematics     63
8   Cathrine  Semester 2  Mathematics     42
9      Alisa  Semester 2      Science     67
10     Bobby  Semester 2      Science     89
11  Cathrine  Semester 2      Science     81

现在,我们想查看不同学期、不同科目的平均分。这正好是透视表的用武之地。

import pandas as pd
import numpy as np

# 构造学生成绩数据(自包含)
student_data = {
    'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine',
             'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine'],
    'Semester': ['Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1',
                 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2'],
    'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science',
                'Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science'],
    'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 67, 89, 81]
}
df = pd.DataFrame(student_data)

# 创建透视表:按学期(行)、科目(列)查看平均分(默认聚合函数)
pivot_mean = df.pivot_table(values='Score', index='Semester', columns='Subject', aggfunc='mean')
print("按学期和科目统计的平均分透视表:")
print(pivot_mean)
按学期和科目统计的平均分透视表:
Subject     Mathematics    Science
Semester
Semester 1    54.666667  60.666667
Semester 2    63.333333  79.000000

这个结果非常直观:行是“学期”,列是“科目”,交叉单元格的值是该学期该科目所有学生成绩的平均值。例如,第一学期数学的平均分是 (62+47+55)/3 ≈ 54.67。

高级参数应用

1. 指定聚合函数

我们可以轻松地将聚合函数从“平均”改为“求和”。

import pandas as pd
import numpy as np

# 构造学生成绩数据(自包含)
student_data = {
    'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine',
             'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine'],
    'Semester': ['Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1',
                 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2'],
    'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science',
                'Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science'],
    'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 67, 89, 81]
}
df = pd.DataFrame(student_data)

# 创建透视表:按学期(行)、科目(列)查看总分
pivot_sum = df.pivot_table(values='Score', index='Semester', columns='Subject', aggfunc=np.sum)
print("按学期和科目统计的总分透视表:")
print(pivot_sum)
按学期和科目统计的总分透视表:
Subject     Mathematics  Science
Semester
Semester 1          164      182
Semester 2          190      237

2. 使用边际汇总 (Margins)

设置margins=True,可以自动添加行和列的汇总(默认是平均值)。

import pandas as pd
import numpy as np

# 构造学生成绩数据(自包含)
student_data = {
    'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine',
             'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine'],
    'Semester': ['Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1',
                 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2'],
    'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science',
                'Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science'],
    'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 67, 89, 81]
}
df = pd.DataFrame(student_data)

# 创建带边际汇总的透视表(求和)
pivot_margin = df.pivot_table(values='Score', index='Semester', columns='Subject', aggfunc=np.sum, margins=True)
print("带边际汇总(总计)的透视表:")
print(pivot_margin)
带边际汇总(总计)的透视表:
Subject     Mathematics  Science  All
Semester
Semester 1          164      182  346
Semester 2          190      237  427
All                 354      419  773

“All”行(最后一行)是各列的总计,例如数学科目的总分是164+190=354。“All”列(最后一列)是各行的总计,例如第一学期的总分是164+182=346。右下角的“All”是所有分数的总和。

3. 应用多个聚合函数

通过向aggfunc传递一个函数列表,可以一次性计算多个统计量。

import pandas as pd
import numpy as np

# 构造学生成绩数据(自包含)
student_data = {
    'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine',
             'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine'],
    'Semester': ['Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1',
                 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2'],
    'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science',
                'Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science'],
    'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 67, 89, 81]
}
df = pd.DataFrame(student_data)

# 创建透视表:一次性计算均值、最大值和最小值
pivot_multi = df.pivot_table(values='Score', index='Semester', columns='Subject', aggfunc=['mean', 'max', 'min'])
print("多聚合函数透视表(均值、最大值、最小值):")
print(pivot_multi)
多聚合函数透视表(均值、最大值、最小值):
                  mean                    max                 min
Subject    Mathematics    Science Mathematics Science Mathematics Science
Semester
Semester 1   54.666667  60.666667          62      77          47      31
Semester 2   63.333333  79.000000          85      89          42      67

结果是一个多层索引的DataFrame。第一层是聚合函数(mean, max, min),第二层是科目(Mathematics, Science)。这样,我们在一张表里就看到了每个学期、每个科目的平均分、最高分和最低分。

实战:透视表在趋势分析中的应用

原课程使用了一个车辆数据集来分析不同年份、不同厂商的电动汽车电池容量(kW)变化。为了便于演示,我们构造一个简化的模拟数据。

假设我们想分析:不同年份下,不同汽车厂商的电动汽车电池容量(kW)有何差异和趋势。

import pandas as pd

# 构造模拟的电动汽车数据
car_data = {
    'YEAR': [2012, 2012, 2013, 2013, 2014, 2014, 2015, 2015, 2016, 2016],
    'Make': ['BMW', 'Nissan', 'Tesla', 'BMW', 'Tesla', 'Nissan', 'Tesla', 'BMW', 'Tesla', 'Nissan'],
    '(kW)': [80, 50, 200, 82, 268, 55, 320, 85, 409, 60]
}
cars_df = pd.DataFrame(car_data)
print("模拟电动汽车数据:")
print(cars_df)
模拟电动汽车数据:
   YEAR    Make  (kW)
0  2012     BMW    80
1  2012  Nissan    50
2  2013   Tesla   200
3  2013     BMW    82
4  2014   Tesla   268
5  2014  Nissan    55
6  2015   Tesla   320
7  2015     BMW    85
8  2016   Tesla   409
9  2016  Nissan    60

现在,我们创建透视表,以年份为行,厂商为列,观察电池容量(kW)的平均值。

import pandas as pd

# 构造模拟的电动汽车数据(自包含)
car_data = {
    'YEAR': [2012, 2012, 2013, 2013, 2014, 2014, 2015, 2015, 2016, 2016],
    'Make': ['BMW', 'Nissan', 'Tesla', 'BMW', 'Tesla', 'Nissan', 'Tesla', 'BMW', 'Tesla', 'Nissan'],
    '(kW)': [80, 50, 200, 82, 268, 55, 320, 85, 409, 60]
}
cars_df = pd.DataFrame(car_data)

# 创建透视表:分析不同年份、不同厂商的电池容量(kW)平均值
trend_pivot = cars_df.pivot_table(values='(kW)', index='YEAR', columns='Make')
print("不同年份与厂商的电池容量(kW)透视表:")
print(trend_pivot)
不同年份与厂商的电池容量(kW)透视表:
Make   BMW  Nissan  Tesla
YEAR
2012  80.0    50.0    NaN
2013  82.0     NaN  200.0
2014   NaN    55.0  268.0
2015  85.0     NaN  320.0
2016   NaN    60.0  409.0

从这个透视表中,我们可以清晰地观察到:

  1. 传统厂商(如BMW、Nissan):电池容量在不同年份间变化不大,基本保持稳定。
  2. 电动汽车厂商(如Tesla):电池容量从2013年的200kW,快速增长到2016年的409kW,呈现明显的上升趋势。
  3. 缺失值(NaN):表示该年份没有对应厂商的数据,透视表会自动处理。

通过这个简单的例子,我们可以看到透视表如何将原始数据转换成一个结构清晰的汇总视图,从而帮助我们快速发现数据中的模式和趋势,例如特定厂商在特定指标上的时间序列变化。

📝 动手练一练

  1. 概念辨析:pivot_table方法中的index参数和columns参数,在最终生成的透视表中,分别决定了数据的什么结构?如果交换它们,结果会怎样?
👉 点击查看参考答案

index参数指定的列,其唯一值会成为透视表的行索引(每一行的标签)。 columns参数指定的列,其唯一值会成为透视表的列索引(每一列的标签)。 如果交换index和columns的参数,那么原来作为行标签的值会变成列标签,原来作为列标签的值会变成行标签,相当于将透视表进行了转置。数据的聚合关系不变,只是展示的维度方向对调了。

  1. 动手实践:使用上面学生成绩的df数据,创建一个透视表,要求以Name(学生姓名)为行,Subject(科目)为列,计算每个学生每个科目的最高分,并且添加边际汇总(margins=True)。请写出代码并描述结果中“Alisa”行“All”列的值代表什么?
👉 点击查看参考答案
import pandas as pd

student_data = {
    'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine',
             'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine'],
    'Semester': ['Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1', 'Semester 1',
                 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2', 'Semester 2'],
    'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science',
                'Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science'],
    'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 67, 89, 81]
}
df = pd.DataFrame(student_data)

result_pivot = df.pivot_table(values='Score', index='Name', columns='Subject', aggfunc='max', margins=True)
print(result_pivot)
Subject   Mathematics  Science  All
Name
Alisa              85       74   85
Bobby              63       89   89
Cathrine           55       81   81
All                85       89   89

运行结果中,“Alisa”行“All”列的值是 85。它代表的是学生Alisa在所有科目(数学和科学)中取得的最高分数。注意,因为aggfunc='max',这里的边际汇总“All”是对行(该学生各科最高分)再取最大值,即该学生的单科最高分。

本章小结

本节课我们深入学习了Pandas中强大的数据重塑与聚合工具——透视表。通过pivot_table方法,我们可以轻松地将二维表格数据,按照指定的行、列维度进行分组,并对数值进行多种方式的聚合,从而生成一个更利于多维度对比和分析的“立体”视图。

📋 行动清单

  • 理解参数:回顾pivot_table的五个核心参数(values, index, columns, aggfunc, margins),明确各自的作用。
  • 动手创建:使用自己熟悉或构造的一个小数据集,尝试创建不同维度的透视表,练习切换行/列、更换聚合函数、添加边际汇总。
  • 尝试分析:像实战案例那样,思考一个可以用行、列两个维度进行交叉分析的业务问题(如:不同月份、不同产品的销售额),并用透视表实现,尝试从结果中发现信息。

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件:透视表操作
    PDF · 157KB
    下载
  • 全套课件打包(第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 数据库
    下载