数据透视

在线刷题

检查 or 强化 Pandas 数据分析操作?👉在线体验「Pandas进阶修炼300题」

Note

本页面代码可以在线编辑、执行

数据透视 可以算是利用 Pandas 进行数据分析最核心的操作,在 pandas 中可以通过 pivot_table 实现, 如果你能熟练使用 Pandas 进行数据透视,将会极大提高工作销效率,因为:

  • 更快的速度,并且可以自动化

  • 更易理解(看代码你就知道它做了什么)

  • 易于使用以生成报告或电子邮件

  • 更灵活,因为您可以定义自定义聚合函数

但其中复杂的参数设置很容易弄混淆,本章第一部分就将通过真实的数据以期望帮助你快速熟悉、使用该函数,在开始之前还是先分享图解来帮助记忆👇

https://pic.liuzaoqi.com/picgo/202112201848914.png

本页数据说明

为了更好的介绍相关操作,本页面使用 某超市销售数据 进行展开,你应该对数据字段、数值、类型等相关信息做一个大致了解!

import pandas as pd
df = pd.read_csv("某超市销售数据.csv",thousands=',')
df.head()
订单ID 订单日期 邮寄方式 国家 地区 省/自治区 细分 类别 子类别 制造商 产品名称 数量 销售额 利润
0 A1000001 2013/1/1 二级 中国 中南 湖南 公司 办公用品 收纳具 Rogers Rogers 文件车, 单宽度 5 3305 1322
1 A1000001 2013/1/1 二级 中国 中南 湖南 公司 家具 桌子 Barricks Barricks 圆桌, 白色 3 5289 -635
2 A1000001 2013/1/1 二级 中国 中南 湖南 公司 技术 电话 诺基亚 诺基亚 智能手机, 整包 3 1725 69
3 A1000001 2013/1/1 二级 中国 中南 湖南 公司 技术 配件 贝尔金 贝尔金 记忆卡, 实惠 3 1607 611
4 A1000003 2013/1/2 二级 中国 华东 福建 消费者 办公用品 收纳具 Rogers Rogers 盒, 工业 4 456 128

默认方法

制作各省「平均销售额」的数据透视表

pd.pivot_table(df,values = ['销售额'],index = '省/自治区')
销售额
省/自治区
上海 1875.712934
云南 1863.789030
内蒙古 1314.826316
北京 1726.857143
吉林 1701.563567
四川 1157.875536
天津 1611.206667
宁夏 1651.680000
安徽 1477.868251
山东 1642.659111
山西 1751.359184
广东 1592.185340
广西 1675.061135
新疆 1402.384615
江苏 1279.898089
江西 1966.477876
河北 1780.275248
河南 1558.400335
浙江 1347.277778
海南 1721.982759
湖北 1324.808442
湖南 1603.702222
甘肃 1602.893443
福建 1732.044693
西藏 201.000000
贵州 1425.978723
辽宁 1363.381982
重庆 1383.082927
陕西 1880.606635
青海 2978.954545
黑龙江 1800.438503

思考

用分组如何实现?

df.groupby("省/自治区")['销售额'].mean() 
省/自治区
上海     1875.712934
云南     1863.789030
内蒙古    1314.826316
北京     1726.857143
吉林     1701.563567
四川     1157.875536
天津     1611.206667
宁夏     1651.680000
安徽     1477.868251
山东     1642.659111
山西     1751.359184
广东     1592.185340
广西     1675.061135
新疆     1402.384615
江苏     1279.898089
江西     1966.477876
河北     1780.275248
河南     1558.400335
浙江     1347.277778
海南     1721.982759
湖北     1324.808442
湖南     1603.702222
甘肃     1602.893443
福建     1732.044693
西藏      201.000000
贵州     1425.978723
辽宁     1363.381982
重庆     1383.082927
陕西     1880.606635
青海     2978.954545
黑龙江    1800.438503
Name: 销售额, dtype: float64

指定维度

制作各省「销售总额」的数据透视表

pd.pivot_table(df,values = ['销售额'],index = '省/自治区',aggfunc = sum)
销售额
省/自治区
上海 594601
云南 441718
内蒙古 249817
北京 350552
吉林 896724
四川 269785
天津 483362
宁夏 41292
安徽 684253
山东 1884130
山西 429083
广东 1520537
广西 383589
新疆 72924
江苏 401888
江西 222212
河北 899039
河南 930365
浙江 266761
海南 99875
湖北 408041
湖南 721666
甘肃 195553
福建 620072
西藏 201
贵州 67021
辽宁 756677
重庆 283532
陕西 396808
青海 65537
黑龙江 1346728

组合计算

制作各省「销售总额」与「平均销售额」的数据透视表

pd.pivot_table(df,values = ['销售额'],index = '省/自治区',aggfunc = ['mean',sum])
mean sum
销售额 销售额
省/自治区
上海 1875.712934 594601
云南 1863.789030 441718
内蒙古 1314.826316 249817
北京 1726.857143 350552
吉林 1701.563567 896724
四川 1157.875536 269785
天津 1611.206667 483362
宁夏 1651.680000 41292
安徽 1477.868251 684253
山东 1642.659111 1884130
山西 1751.359184 429083
广东 1592.185340 1520537
广西 1675.061135 383589
新疆 1402.384615 72924
江苏 1279.898089 401888
江西 1966.477876 222212
河北 1780.275248 899039
河南 1558.400335 930365
浙江 1347.277778 266761
海南 1721.982759 99875
湖北 1324.808442 408041
湖南 1603.702222 721666
甘肃 1602.893443 195553
福建 1732.044693 620072
西藏 201.000000 201
贵州 1425.978723 67021
辽宁 1363.381982 756677
重庆 1383.082927 283532
陕西 1880.606635 396808
青海 2978.954545 65537
黑龙江 1800.438503 1346728

组合多列

制作各省市「销售总额」与「利润总额」的数据透视表

pd.pivot_table(df,values = ['销售额','利润','数量'],index = '类别',aggfunc = sum)
利润 数量 销售额
类别
办公用品 752124 21389 4844936
家具 628052 8434 5696531
技术 742264 7613 5442876

组合索引

制作「各省市」与「不同类别」产品「销售总额」的数据透视表

pd.pivot_table(df,values = ['销售额'],index = ['省/自治区','类别'],aggfunc = sum)
销售额
省/自治区 类别
上海 办公用品 198529
家具 221058
技术 175014
云南 办公用品 123051
家具 174155
... ... ...
青海 家具 25923
技术 22896
黑龙江 办公用品 473319
家具 497504
技术 375905

91 rows × 1 columns

多层透视

制作各省市「不同类别」产品的「销售总额」透视表

pd.pivot_table(df,values = ['销售额'],index = ['省/自治区'], columns='类别',aggfunc = sum)
销售额
类别 办公用品 家具 技术
省/自治区
上海 198529.0 221058.0 175014.0
云南 123051.0 174155.0 144512.0
内蒙古 74058.0 95426.0 80333.0
北京 144232.0 127407.0 78913.0
吉林 215143.0 287498.0 394083.0
四川 111393.0 88297.0 70095.0
天津 142526.0 149452.0 191384.0
宁夏 19529.0 16449.0 5314.0
安徽 200511.0 215901.0 267841.0
山东 575520.0 664339.0 644271.0
山西 121458.0 175522.0 132103.0
广东 494643.0 530054.0 495840.0
广西 102625.0 165140.0 115824.0
新疆 38345.0 20520.0 14059.0
江苏 163919.0 152868.0 85101.0
江西 37114.0 107047.0 78051.0
河北 284739.0 306535.0 307765.0
河南 266916.0 294593.0 368856.0
浙江 84471.0 84436.0 97854.0
海南 34141.0 41225.0 24509.0
湖北 112230.0 118053.0 177758.0
湖南 197969.0 241804.0 281893.0
甘肃 54012.0 68657.0 72884.0
福建 142728.0 243289.0 234055.0
西藏 201.0 NaN NaN
贵州 9713.0 29285.0 28023.0
辽宁 214994.0 270279.0 271404.0
重庆 71020.0 96318.0 116194.0
陕西 119169.0 187497.0 90142.0
青海 16718.0 25923.0 22896.0
黑龙江 473319.0 497504.0 375905.0

综合使用

制作「各省市」、「不同类别」产品「销售量与销售额」的「均值与总和」的数据透视表,并在最后追加一行『合计』

pd.pivot_table(df,values = ['销售额','数量'],index = ['省/自治区','类别'],aggfunc = ['mean',sum],margins=True)
mean sum
数量 销售额 数量 销售额
省/自治区 类别
上海 办公用品 3.706897 1140.971264 645 198529
家具 4.132530 2663.349398 343 221058
技术 3.616667 2916.900000 217 175014
云南 办公用品 3.913043 891.673913 540 123051
家具 4.224490 3554.183673 207 174155
... ... ... ... ... ...
青海 技术 3.833333 3816.000000 23 22896
黑龙江 办公用品 3.657471 1088.089655 1591 473319
家具 3.921687 2997.012048 651 497504
技术 3.442177 2557.176871 506 375905
All 3.768093 1608.892099 37436 15984343

92 rows × 4 columns

透视筛选

在上一题的基础上,查询 「类别」 等于 「办公用品」 的详情

table = pd.pivot_table(df,values = ['销售额','数量'],index = ['省/自治区','类别'],aggfunc = ['mean',sum],margins=True)
table.query('类别 == ["办公用品"]')
mean sum
数量 销售额 数量 销售额
省/自治区 类别
上海 办公用品 3.706897 1140.971264 645 198529
云南 办公用品 3.913043 891.673913 540 123051
内蒙古 办公用品 3.391304 643.982609 390 74058
北京 办公用品 3.750000 1163.161290 465 144232
吉林 办公用品 3.520270 726.834459 1042 215143
四川 办公用品 3.947368 837.541353 525 111393
天津 办公用品 3.917127 787.436464 709 142526
宁夏 办公用品 3.750000 1627.416667 45 19529
安徽 办公用品 3.710526 753.800752 987 200511
山东 办公用品 3.775112 862.848576 2518 575520
山西 办公用品 3.880597 906.402985 520 121458
广东 办公用品 3.908088 909.270221 2126 494643
广西 办公用品 3.954545 777.462121 522 102625
新疆 办公用品 3.575758 1161.969697 118 38345
江苏 办公用品 3.849741 849.321244 743 163919
江西 办公用品 3.523077 570.984615 229 37114
河北 办公用品 3.968750 988.677083 1143 284739
河南 办公用品 3.628242 769.210375 1259 266916
浙江 办公用品 3.684211 740.973684 420 84471
海南 办公用品 3.314286 975.457143 116 34141
湖北 办公用品 3.666667 645.000000 638 112230
湖南 办公用品 3.629771 755.606870 951 197969
甘肃 办公用品 4.206349 857.333333 265 54012
福建 办公用品 3.801047 747.267016 726 142728
西藏 办公用品 3.000000 201.000000 3 201
贵州 办公用品 3.954545 441.500000 87 9713
辽宁 办公用品 3.741722 711.900662 1130 214994
重庆 办公用品 3.876106 628.495575 438 71020
陕西 办公用品 3.816667 993.075000 458 119169
青海 办公用品 4.444444 1857.555556 40 16718
黑龙江 办公用品 3.657471 1088.089655 1591 473319

逆透视

逆透视就是将宽的表转换为长的表,例如将第 5 题的透视表进行逆透视,其中不需要转换的列为『数量』列

table = pd.pivot_table(df,values = ['销售额','利润','数量'],index = '类别',aggfunc = sum)
table.melt(id_vars=['数量'],var_name='分类',value_name='金额')
数量 分类 金额
0 21389 利润 752124
1 8434 利润 628052
2 7613 利润 742264
3 21389 销售额 4844936
4 8434 销售额 5696531
5 7613 销售额 5442876