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

透视表介绍

约 7 分钟

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

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

在数据分析中,我们经常需要从不同维度对数据进行交叉汇总和统计。本节将介绍一种强大的数据分析工具——透视表(Pivot Table)。透视表能够将扁平的原始数据表,转换成一个多维度、立体的汇总表,让你可以轻松地从行、列两个方向观察数据的聚合结果,极大地提升了数据探索和洞察的效率。

💡 核心导读

  • 透视表是什么:一种用于计算、汇总和分析数据的强大工具,核心是将扁平数据转换为立体数据。
  • 扁平 vs 立体:扁平表只有行和列记录原始数据;立体表则用行和列表示不同的分类维度,交叉单元格存放汇总值。
  • 与分组聚合的关系:透视表在底层包含了分组和聚合操作,但其输出形式是更便于多维度观察的“立体”结构。
  • 应用场景:快速统计如“每学期每门课的平均分”、“每月各类别的消费总额”等多维度交叉分析需求。

什么是透视表?

如果你使用过 Excel,那么对“数据透视表”这个功能应该不会陌生。在 Pandas 中,透视表同样扮演着至关重要的角色。

严格来说,透视表是一种分析数据的方式。它能够将原始数据转换成一种更复杂、也更有用的统计信息呈现形式。本质上,它是一个包含了分组与统计操作的强大工具。

正因为如此,你会发现透视表的功能与之前学过的分组聚合(GroupBy) 非常相似。它们都涉及对数据进行分类和计算。那么,它们之间到底有什么区别和联系呢?让我们通过一个核心概念来理解。

从“扁平”到“立体”:透视表的核心过程

透视表完成了一个关键的过程:将扁平的表格,转换成立体的表格。

  • 扁平的表格:这是我们最常见的数据形式,例如 CSV 文件、Excel 表格。它只包含行和列。每一行是一条独立的记录,每一列是一个属性字段。数据是“平铺”开的。
  • 立体的表格:在这种表格中,行和列本身代表了不同的数据类别或维度,而行与列交叉的单元格中存放的,则是根据这两个维度聚合计算出来的值。

让我们通过一个具体的消费数据例子来直观感受一下。

假设我们有一份简单的消费记录,是一个“扁平”的表:

import pandas as pd

# 创建一份扁平的消费记录数据
data = {
    '月份': ['1月', '1月', '2月', '2月', '3月', '3月'],
    '类别': ['娱乐', '日用杂货', '娱乐', '交通', '日用杂货', '交通'],
    '金额': [100, 200, 125, 150, 180, 90]
}
flat_df = pd.DataFrame(data)
print("原始的扁平消费记录表:")
print(flat_df)
原始的扁平消费记录表:
   月份    类别   金额
0  1月    娱乐  100
1  1月  日用杂货  200
2  2月    娱乐  125
3  2月    交通  150
4  3月  日用杂货  180
5  3月    交通   90

现在,我们想得到一个“立体”的汇总表:行是消费类别,列是月份,中间的值是该类别在该月的总消费金额。

# 使用pivot_table方法创建透视表(此处先演示结果,下节详解用法)
# 注意:此代码块完全自包含,重新构造数据
import pandas as pd
data = {
    '月份': ['1月', '1月', '2月', '2月', '3月', '3月'],
    '类别': ['娱乐', '日用杂货', '娱乐', '交通', '日用杂货', '交通'],
    '金额': [100, 200, 125, 150, 180, 90]
}
flat_df = pd.DataFrame(data)

pivot_result = flat_df.pivot_table(values='金额', index='类别', columns='月份', aggfunc='sum', fill_value=0)
print("转换后的立体透视表:")
print(pivot_result)
转换后的立体透视表:
月份     1月   2月   3月
类别
交通      0  150   90
娱乐    100  125    0
日用杂货  200    0  180

看!这就是一个“立体”的透视表。

  • 行索引(index):是“类别”这个维度(娱乐、交通、日用杂货)。
  • 列索引(columns):是“月份”这个维度(1月、2月、3月)。
  • 值(values):是行与列交叉点的“金额”总和。

这种格式的好处显而易见:我可以横向查看某个类别在所有月份的花费(如“娱乐”总计225元),也可以纵向查看某个月份所有类别的花费(如“2月”总计275元)。分析效率远高于在扁平表中逐行筛选计算。

透视表与分组聚合:区别与联系

回到最初的问题:透视表和分组聚合是什么关系?我们用一个更典型的例子来说明。

假设我们有一份学生成绩记录,需要统计每学期、每门课的平均分。

import pandas as pd

# 创建学生成绩数据
d = {
    '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(d)
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

方法一:使用分组聚合(GroupBy) 我们可以按 Semester 和 Subject 进行层级分组,然后对 Score 求平均。

# 使用groupby进行层级分组聚合
import pandas as pd
d = {
    '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(d)

grouped_result = df.groupby(by=['Semester', 'Subject'])['Score'].mean().to_frame()
print("使用GroupBy得到的分组聚合结果(扁平格式):")
print(grouped_result)
使用GroupBy得到的分组聚合结果(扁平格式):
                            Score
Semester   Subject
Semester 1 Mathematics  54.666667
           Science      60.666667
Semester 2 Mathematics  63.333333
           Science      79.000000

这个结果正确吗?完全正确!它给出了我们需要的统计值。但是,它的格式仍然是“扁平”的:Semester 和 Subject 共同构成了一个多层级的行索引,Score 是单独的一列。要查看“第一学期数学平均分”,你需要找到对应的行。

方法二:使用透视表(Pivot Table) 透视表可以实现同样的聚合计算,但输出是我们想要的“立体”格式。

# 使用pivot_table创建透视表
import pandas as pd
d = {
    '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(d)

pivot_result = df.pivot_table(values='Score', index='Semester', columns='Subject', aggfunc='mean')
print("使用透视表得到的结果(立体格式):")
print(pivot_result)
使用透视表得到的结果(立体格式):
Subject     Mathematics    Science
Semester
Semester 1    54.666667  60.666667
Semester 2    63.333333  79.000000

现在,表格结构发生了变化:

  • 行(index):Semester(学期)
  • 列(columns):Subject(科目)
  • 值(values):Score 的平均分

这个“立体”的视图让比较变得异常轻松:

  • 横向看,可以比较同一学期内不同科目的平均分(例如,第一学期科学课比数学课平均分高约6分)。
  • 纵向看,可以观察同一科目在不同学期的表现变化(例如,数学课平均分从第一学期到第二学期有所提升)。

总结关系

  • 联系:透视表在底层逻辑上基于分组聚合。它指定行、列作为分组键,并对指定的值进行聚合运算。
  • 区别:透视表侧重于结果的呈现形式。它自动将分组键的一个维度分配到列上,生成一个行列交叉的“立体”表格,这种格式对于多维度对比分析更加直观和高效。

透视表的应用场景与价值

通过上面的例子,我们可以总结出透视表的典型应用场景:

  1. 多维度交叉分析:如“各地区-各产品-各季度的销售额”。
  2. 数据汇总与对比:快速生成汇总报表,并支持行、列双向对比。
  3. 数据透视与洞察:通过拖拽不同的字段到行、列、值区域,从不同角度“透视”数据,发现潜在规律。

它的核心价值在于,将复杂的数据聚合逻辑,封装成一个简单直观的表格操作,让分析师能够更专注于业务问题本身,而不是数据处理代码的细节。

📝 动手练一练

  1. 概念辨析:回顾本节课内容,请简述“扁平”表格和“立体”表格在数据结构上的根本区别是什么?透视表在这其中起到了什么作用?
👉 点击查看参考答案

根本区别:

  • 扁平表格:行和列直接存储原始数据记录。行代表记录实例,列代表属性。结构是二维的(行,列)。
  • 立体表格:行和列本身代表数据的分类维度(类别),而行列交叉的单元格存储的是基于这两个维度聚合计算后的汇总值。结构可以看作是三维的(行维度,列维度,聚合值)。

透视表的作用:透视表是一个工具/过程,它接收一个扁平的原始数据表,根据用户指定的行分类维度、列分类维度和待聚合的数值字段,执行分组和聚合计算,最终输出一个立体的汇总表格,从而实现对数据的多维度、结构化洞察。

  1. 代码实践:假设你有一份销售数据,包含销售日期、产品类别和销售额。如果直接使用groupby按销售日期和产品类别对销售额求和,得到的是一个多层索引的Series。请你想一想,如何调整pivot_table方法的参数,才能得到一个以销售日期为行、产品类别为列、销售额总和为值的立体透视表?(无需写完整代码,列出关键参数即可)
👉 点击查看参考答案

关键参数如下:

  • values='销售额':指定要聚合的数值列。
  • index='销售日期':指定作为行索引的分类维度。
  • columns='产品类别':指定作为列索引的分类维度。
  • aggfunc='sum':指定聚合函数为求和。

即:df.pivot_table(values='销售额', index='销售日期', columns='产品类别', aggfunc='sum')

本章小结

本节我们引入了数据分析中的利器——透视表。你理解了它作为一种将扁平数据转换为立体数据的强大工具的本质,并通过与分组聚合的对比,清晰把握了二者的联系与区别。透视表以其直观的交叉表格形式,让多维度数据分析变得一目了然。

📋 行动清单

学完本节,你可以立即尝试:

  • 在脑海中回忆“扁平表”和“立体表”的典型样子,并举例说明。
  • 明确说出透视表与groupby分组聚合的核心共同点(分组+聚合)与主要区别(输出格式的立体化)。
  • 准备好在下节课中,学习如何使用Pandas的pivot_table函数的具体参数来创建属于自己的透视表。

—— 小象教研组

配套资料 · 直接下载

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

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