查看全课大纲(第 57 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.3D绘图 -- mplot3d
- 82.3D曲线可视化
- 83.3D散点图可视化
- 84.3D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 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分)。
- 纵向看,可以观察同一科目在不同学期的表现变化(例如,数学课平均分从第一学期到第二学期有所提升)。
总结关系
- 联系:透视表在底层逻辑上基于分组聚合。它指定行、列作为分组键,并对指定的值进行聚合运算。
- 区别:透视表侧重于结果的呈现形式。它自动将分组键的一个维度分配到列上,生成一个行列交叉的“立体”表格,这种格式对于多维度对比分析更加直观和高效。
透视表的应用场景与价值
通过上面的例子,我们可以总结出透视表的典型应用场景:
- 多维度交叉分析:如“各地区-各产品-各季度的销售额”。
- 数据汇总与对比:快速生成汇总报表,并支持行、列双向对比。
- 数据透视与洞察:通过拖拽不同的字段到行、列、值区域,从不同角度“透视”数据,发现潜在规律。
它的核心价值在于,将复杂的数据聚合逻辑,封装成一个简单直观的表格操作,让分析师能够更专注于业务问题本身,而不是数据处理代码的细节。
📝 动手练一练
- 概念辨析:回顾本节课内容,请简述“扁平”表格和“立体”表格在数据结构上的根本区别是什么?透视表在这其中起到了什么作用?
👉 点击查看参考答案
根本区别:
- 扁平表格:行和列直接存储原始数据记录。行代表记录实例,列代表属性。结构是二维的(行,列)。
- 立体表格:行和列本身代表数据的分类维度(类别),而行列交叉的单元格存储的是基于这两个维度聚合计算后的汇总值。结构可以看作是三维的(行维度,列维度,聚合值)。
透视表的作用:透视表是一个工具/过程,它接收一个扁平的原始数据表,根据用户指定的行分类维度、列分类维度和待聚合的数值字段,执行分组和聚合计算,最终输出一个立体的汇总表格,从而实现对数据的多维度、结构化洞察。
- 代码实践:假设你有一份销售数据,包含
销售日期、产品类别和销售额。如果直接使用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 数据库