利用excel与Pandas完成实现数据透视表

434 篇文章 9 订阅
346 篇文章 4 订阅

数据透视表是一种分类汇总数据的方法。本文章将会介绍如何用Pandas完成数据透视表的制作和常用操作。

1,制作数据透视表

制作数据透视表的时候,要确定这几个部分:行字段、列字段、数据区,汇总函数。数据透视表的结构如图1所示。
在这里插入图片描述
图1 数据透视表的结构

Excel制作数据透视表很简单,选中表格数据,并点击工具栏上的“数据透视表”菜单即可,如图2所示。
在这里插入图片描述
Pandas里制作数据透视表主要使用pivot_table方法。pivot_table方法的调用形式如下:

DataFrame.pivot(index, columns, values, aggfunc)

其实index参数对应行字段,columns参数对应列字段,values参数对应数据区。aggfunc的默认值是numpy.mean,也就是计算平均值。

下面结合实例讲解pivot_table的用法,首先用以下代码导入示例数据:

import pandas as pd
import xlwings as xw

path = "D:/chapter11/数据透视表.xlsx"
wb = xw.Book(path)
sheet = wb.sheets[0]
df = sheet.range("A1:E7").options(pd.DataFrame, index=False, header=True).value

用pivot_table方法制作数据透视表,商品作为行字段,品牌作为列字段,销售额放在数据区,这样设置:

pt1 = df.pivot_table(index='商品', columns='品牌', values='销售额')
sheet.range("G1").options(index=True, header=True).value = pt1

结果如图3所示。这个表格计算的是销售额的平均值。
在这里插入图片描述
图3 商品销售数据透视表

上面的代码修改一下,把数量放在数据区,设置汇总函数是sum:

pt2 = df.pivot_table(index='商品', columns='品牌', values='数量' , aggfunc='sum')
sheet.range("G8").options(index=True, header=True).value = pt2

结果如图4所示。这个表格计算的是销售数量的和。
在这里插入图片描述
图4 商品销售数据透视表

可以看到这两个数据透视表是有缺失值的,pivot_table有一个参数fill_value,就是用来填充这些缺失值的,例如:

df.pivot_table(index='商品', columns='品牌', values='数量', fill_value=0)

pivot_table方法还支持对透视表进行统计计算,而且会新建一个列来存放计算结果。这个统计需要用到以下两个参数:

  • q margins,设定是否添加汇总列,一般设置为True。
  • q margins_name,汇总列的名称。

示例代码如下:

pt3 = df.pivot_table(index='商品', columns='品牌', values='销售额', fill_value=0, aggfunc='sum', margins=True, margins_name="汇总")
sheet.range("L1").options(index=True, header=True).value = pt3

计算结果如图5所示。
在这里插入图片描述
图5 数据透视表汇总计算

参数index和values都可以是列表类型,例如:

pt4 = df.pivot_table(index=['品牌', '商品'], values=['销售额', '利润'], aggfunc='sum')
sheet.range("L8").options(index=True, header=True).value = pt4

统计结果如图6所示。
在这里插入图片描述

这个数据透视表可以对利润和销售额进行不同的汇总计算,这时候aggfunc是字典类型,例如对销售额计算平均值,对利润计算总和,可以这样:

pt5 = df.pivot_table(index=['品牌', '商品'], values=['销售额', '利润'],  aggfunc={
    '销售额':'mean', '利润':'sum'})
sheet.range("L15").options(index=True, header=True).value = pt5

统计结果如图7所示。
在这里插入图片描述
统计结果如图7所示。

对于同一个指标可以设定多个汇总函数,例如:

pt6 = df.pivot_table(index=['品牌', '商品'], values=['销售额', '利润'],  aggfunc={
    '销售额':['mean', 'sum'], '利润':['mean', 'sum']})
sheet.range("L22").options(index=True, header=True).value = pt6

统计结果如图8所示。
在这里插入图片描述
图8 统计结果

2,筛选数据透视表中的数据

pivot_table的运算结果是一个DataFrame类型,所以可以用DataFrame截取数据的方法筛选数据透视表中的数据。本节用于示例的数据透视表如下:

pt = df.pivot_table(index='商品', columns='品牌', values='销售额', fill_value=0, aggfunc='sum', margins=True, margins_name="汇总")

在jupyter中输出pt如图9所示。
在这里插入图片描述
图9 输出变量pt

下面给出几个筛选数据的例子,这些例子的结果都可以通过Range对象的options方法转换成Excel表格数据。

(1)仅保留汇总列的数据。

pt['汇总']

结果是一个Series,如下所示。

商品
洗衣机     24000.0
电风扇     62000.0
空调      81000.0
汇总     167000.0
Name: 汇总, dtype: float64

要提取洗衣机的汇总数据,可以用以下表达式:

pt['汇总']['洗衣机']

(2)获取品牌A、B、C的汇总数据。

pt[['A', 'B', 'C']]

结果如图10所示。
在这里插入图片描述
图10 获取品牌A、B、C的汇总数据

(3)仅保留商品洗衣机的汇总数据。

pt.loc['洗衣机']

结果如下所示。

品牌
A     11000.0
B         0.0
C     13000.0
汇总    24000.0
Name: 洗衣机, dtype: float64

(4)仅保留商品洗衣机和电风扇的汇总数据。

pt.loc[['洗衣机', '电风扇']]

结果如图11所示。
在这里插入图片描述
图11 仅保留结果的某些行

(5)仅保留汇总数据某些行和列。

pt[['A', 'B', 'C']].loc[['洗衣机', '电风扇']]

输出结果如图12所示。
在这里插入图片描述
图12 仅保留汇总数据某些行和列

3,使用字段列表排列数据透视表中的数据

数据透视表是一个DataFrame,所以可以用sort_values方法来按某列排序,示例代码如下:

pt = df.pivot_table(index='商品', columns='品牌', values='销售额', fill_value=0, aggfunc='sum', margins=True, margins_name="汇总")
pt.sort_values(by="汇总")

结果如图13所示。
在这里插入图片描述
图13 按汇总列升序排列

4,对数据透视表中的数据进行分组

在Excel中还支持对数据透视表中的数据进行分组,例如可以把风扇和空调的数据分为一组来计算,如图14所示。
在这里插入图片描述
图14 对数据透视表中的数据进行分组
用Pandas也可以实现类似的统计,示例代码如下:

代码11-9 对数据透视表中的数据进行分组统计

import pandas as pd
import xlwings as xw

path = "D:/chapter11/数据透视表.xlsx"
wb = xw.Book(path)

pt = df.pivot_table(index='商品',  values='销售额', fill_value=0, aggfunc='sum', 
                   margins=True, margins_name="总计")
pt.loc['分组1'] = pt.loc['电风扇'] + pt.loc['空调']
pt.loc['分组2'] = pt.loc['洗衣机']
# reindex方法重新排列表格
grouppt = pt.reindex(['分组1', '电风扇', '空调', '分组2', '洗衣机', '总计'])
sheet.range("A9").options(index=True, header=True).value = grouppt

输出结果如图15所示。
在这里插入图片描述

代码中最关键的部分就是用loc属性读取数据透视表的行数据并进行相加运算得出分组统计结果。

最后

作为一个IT的过来人,我自己整理了一些python学习资料,希望对你们有帮助。
有问题可以扫描下面二维码——>添加csdn官方认证二维码探讨

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值