查看全课大纲(第 58 / 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.实战:通过移动设备行为数据预测性别和年龄
透视表操作
约 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 2372. 使用边际汇总 (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从这个透视表中,我们可以清晰地观察到:
- 传统厂商(如BMW、Nissan):电池容量在不同年份间变化不大,基本保持稳定。
- 电动汽车厂商(如Tesla):电池容量从2013年的200kW,快速增长到2016年的409kW,呈现明显的上升趋势。
- 缺失值(NaN):表示该年份没有对应厂商的数据,透视表会自动处理。
通过这个简单的例子,我们可以看到透视表如何将原始数据转换成一个结构清晰的汇总视图,从而帮助我们快速发现数据中的模式和趋势,例如特定厂商在特定指标上的时间序列变化。
📝 动手练一练
- 概念辨析:
pivot_table方法中的index参数和columns参数,在最终生成的透视表中,分别决定了数据的什么结构?如果交换它们,结果会怎样?
👉 点击查看参考答案
index参数指定的列,其唯一值会成为透视表的行索引(每一行的标签)。 columns参数指定的列,其唯一值会成为透视表的列索引(每一列的标签)。 如果交换index和columns的参数,那么原来作为行标签的值会变成列标签,原来作为列标签的值会变成行标签,相当于将透视表进行了转置。数据的聚合关系不变,只是展示的维度方向对调了。
- 动手实践:使用上面学生成绩的
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 数据库