python与vba技术特点分析_用Python处理了数据还要导入Excel做图表?直接Python做漂亮图表...

d50735fae6cd7b89a6046f5a4b004aa2d8330ea3.jpeg?token=c62b1594bec6a6aa4c47cdcfa53bfdf4&s=BA9360845EE2AA53569FF911030070C9

请关注本号,后续会有更多相关教程。

系列文章

学Python还不会处理Excel数据?带你用pandas玩转各种数据处理“Python替代Excel Vba”系列(二):pandas分组统计与操作Excel“Python替代Excel Vba”系列(三):pandas处理不规范数据

前言

前一节我们已经成功把一份教师课程表整理成规范的形式,本节我们就看一下怎么利用这份数据,分析实际情况,并且用图表来说明数据。

本文要点:

使用 pandas 快速按需求做汇总整理。

注意:虽然本文是"Python替代Excel Vba"系列,但希望各位读者明白,工具都是各有所长,选择适合的工具,才是最好的。

2fdda3cc7cd98d105e63f70f641bb00b7bec9006.jpeg?token=3b07d6e78c17197d9a736b924059d40d&s=F21C7E8657A3D8E45A2B826E03007078

案例

这次的数据是基于上一节已整理的教师课程表。如下图:

a2cc7cd98d1001e94e86998dfc2a73e955e797a7.jpeg?token=31dae8d90a73c0a8a0c1cab65019a714&s=BA92A14C52F5B07F0CFDF40F000070C2

表中的一行表示 某一天的某课时是哪位教师负责的哪门科目。这里的名字按照原有数据做了脱敏(teach 列)。

本文所用到的 pandas 技巧都在之前的章节已有详细介绍,因此本文只对重点细节做讲解

设定问题

本文的目标问题如下:

科目的分配情况如何?教师的课时分配如何?

导入包

本文所需的包,安装命令如下:

pip install pandaspip install numpypip install pyecharts

建议你安装 anaconda ,那么最难安装的 pandas 和 numpy 都不会是问题。

脚本中导入

0ff41bd5ad6eddc4a7dd15f57cffbef8526633ab.jpeg?token=3dd55997ff9dfecf17d5713c12b5e8b1&s=B29031C0FFA0BD704E45F40E0000F0C3

本文使用 pyecharts 做可视化输出

加载数据

代码如下:

cdbf6c81800a19d851eac25377de8a8ea71e46a0.jpeg?token=e42adefe1a3f7b04cbc752ae042a8911&s=B281B1486FE4BF705E6DA80C000050C2

这次直接从 csv 文件读取即可。

主科目占比

要看主科目占比,那么首先根据科目划分主次科目。如下:

8326cffc1e178a8246e7fd62b2277b88ab77e8c7.jpeg?token=260b0d93ee65263cd3bc92c8cd1d1cd8&s=B29031C88DCC8D7204F4A109000030C3

df['sj'].apply(lambda x: '语数英' if x in cond else '其他') ,根据科目列,划分为"语数英"或"其他"把划分结果添加的新列 sj_class 。

现在数据如下:

7dd98d1001e93901b8a92e0c3ec85ce236d19606.jpeg?token=5c36d0e17612ae3ba64c5e7d843b6005&s=3A92A14C56F5906B0E75D41F000080C2

现在可以看看主科目的数量。我们把汇总问题的主键列出,利用pandas的groupby方法即可快速做汇总。如下:

1c950a7b02087bf4d66198ddb7f75f2911dfcf1b.jpeg?token=9b4867dbbe5e06be787e6975f248ba08&s=FAA0E1489BE09F7052658C0B0000E0C3

df.groupby(['sj_class']) ,按 sj_class 分组。.size() ,即可求得每组的个数。这里使用 count 也可以,但你会注意到使用 count ,pandas 会把所有列都进行计数。并且 count 会忽略 nan ,而 size 则不会。.reset_index() ,调用 groupby 后,分组的 sj_class 会作为 index ,因此这里只是把 sj_class 重新设置为列。

来看看实际占比吧。

a0a7ddca595d5c144865904e761592622235.gif

上述2次汇总其实是可以定义为一个通用的方法。这里是为了方便解析因此复制了2段差不多的代码

按班级看科目占比

只是看整体的占比情况不太可以了解数据。我们试试再深入一些维度去看看数据。看看每个级别的主科目占比情况。如下:

1c950a7b02087bf4fe7e817eb6f75f2910dfcf45.jpeg?token=cd9b1fe2ee62b8c213c5c29e1749824e&s=BA81A14C8BEC9F7016C9A5070000F0C3

这次我们的汇总主键是 级别和主科目。可以看到其实与之前的流程基本一致,只是在分组时加上了 grade 字段。

看看图表吧:

0a686d6255775b9a3bf7bfbd561826f04558.gif

可以看到五年级的语数英课时占比最大(为什么不是六年级的主科目占比最大?)。七、八年级语数英没有其他科目占比大(初一初二语数英课时减少了?)。

教师分配情况

来个复杂一点的需求,看教师分配情况,我们设定如下要求:

每位教师的上下午课时数量,并且按课时数量排序。每位教师每天的上下午课时数量,并且按课时数量排序。

首先,每位教师的上下午课时数量。主键是教师和上下午。代码如下:

48540923dd54564e7650a1caf4fa9487d1584f31.jpeg?token=1e266e4187fd797bf78fb3b879e98341&s=B281F14892B4B36C4C50400F0000E0C2

分组汇总与之前的一致。只是主键不同而已。res.groupby('teach')['value'].transform('sum') ,求出每位教师的总课时res['total'].rank(ascending=False) ,做一个排名。

这里重点说一下这段代码:

9345d688d43f87948122226c963f06f11ad53abf.jpeg?token=ba0688997f727ac1381dee69149d6e18&s=BAA1E1485BE4A84B44451C0B000070C2

这里为了做图表,需要确保每位教师都有上午和下午2行数据。但实际数据中有些教师只有半天的课(如下图的教师 n56)。

8b13632762d0f7032ef382664cde59382797c5f4.jpeg?token=a48bb7cbdf5b4dc05d1ca5ea1857816d&s=3A92814E72F5906E5C5D840D000070C3

.set_index(['teach','apm']) ,先让 teach 和 apm 做行索引。此时 apm 行索引中都有上午和下午的值。.unstack() ,把 apm 从行索引移到列索引。那么就会有 上午列 和 下午列。注意此时,如果一位教师只有下午的课,那么此列他的值就为 nan。

6f061d950a7b0208632ab41126fdfad6562cc80c.jpeg?token=1cb3ca0a08ab5233957dd4930e7e0a9a&s=BA92A14CDAE5916E5C496C0F000070C2

.stack(dropna=False) ,把 apm 从列索引移回去行索引,dropna=False ,让其保留 nan 的值。此时即可确保所有的教师都有上下午2行数据。

cdbf6c81800a19d8f17ea29b77de8a8ea71e46d3.jpeg?token=db450886b9981ea796138c0bbda065ad&s=3A93E14CD2E5916E18F4C5090000C0C2

直接看可视化吧:

435d3bafa9f295e2b8420db59687fe9c2600.gif

上图可以看出来,n4 这教师是最多课时(20课时)大部分的教师都是上午比下午课时多(这很可能是因为本来下午的课时就比上午少啊)- 有4位教师只有下午有课。

再看看每天分别是哪位教师比较忙的。

dc16008e08135ca831565afd0ff30c211441.gif

n4 这位教师星期二下午就完全没有课时。

上述2次汇总其实是可以定义为一个通用的方法。这里是为了方便解析因此复制了2段差不多的代码

8ad4b31c8701a18b10a61760db0b0f0d2838fe7d.jpeg?token=094371756fcf7dc5d17bc5c6ccbd7e3f&s=9011EE3208C752C8138DCDC4030070E3

最后

本文重点

从分析问题出提取主键,使用 groupby 即可快速得到数据。灵活运用 stack 与 unstack ,可以快速做一些数据增补。

请关注本号,后续会有更多相关教程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值