Zaoqi's Blog -> Python数据分析教程 -> 图解Pandas ->
数据透视
数据透视¶
在线刷题
检查 or 强化 Pandas
数据分析操作?👉在线体验「Pandas进阶修炼300题」
Note
本页面代码可以在线编辑、执行!
数据透视 可以算是利用 Pandas 进行数据分析最核心的操作,在 pandas 中可以通过 pivot_table
实现,
如果你能熟练使用 Pandas
进行数据透视,将会极大提高工作销效率,因为:
更快的速度,并且可以自动化
更易理解(看代码你就知道它做了什么)
易于使用以生成报告或电子邮件
更灵活,因为您可以定义自定义聚合函数
但其中复杂的参数设置很容易弄混淆,本章第一部分就将通过真实的数据以期望帮助你快速熟悉、使用该函数,在开始之前还是先分享图解来帮助记忆👇
本页数据说明¶
为了更好的介绍相关操作,本页面使用 某超市销售数据 进行展开,你应该对数据字段、数值、类型等相关信息做一个大致了解!
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 |
On this page