今天要讲的是:
如何用python读取多个excel文件中的数据并进行处理
1、需要用到的模块
pandas
先引入这个武器:
import pandas aspd
2、准备工作:
准备两个有数据的Excel文件,我们假设它的名字叫的"test1809.xlsx"和"test1810.xlsx", 里面有一个sheet页,叫"sheet1",这里我准备的是两张费用报销表,模拟两个月的费用报销记录。
3、分别读取两张excel表格中的数据:
df09 = pd.read_excel("d:\\data\\test1809.xlsx")
df10 = pd.read_excel("d:\\data\\test1810.xlsx")
比较一下,两个月报销金额的最大值,我们用到max()这个“方法”,找最大值:
df09["报销金额"].max()
df10["报销金额"].max()
比较一下,两个月报销费用总额的差异,我们要用到sum这个“方法”:
sum09 = df09["报销金额"].sum()
sum10 = df10["报销金额"].sum()
我们把两个月费用的总额结果,临时存放在两个“变量”中,变量是编程中的概念,你可以把它理解为excel中存放汇总值的一个单元格。
计算总额的差异:
sum10 - sum09
如果想看看两个月中谁报销的费用最多,怎么办?
我们可以用到groupby方法,进行“透视”,透视的方法是“求和”,所以也要用到sum。我们把透视后的结果存放在temp09和temp10两个临时变量中,你可以把它们理解为Excel中透视时,结果存放在新sheet页,有一点点Sql语句基础的同学,应该可以理解:
temp09 = df09.groupby(by="姓名").sum()
temp10 =df010.groupby(by="姓名").sum()
结果如下:
如果想提取一下两个月费用报销Top3的人员,以提供给管理层,可以这样做:
我们要用到pandas的两个新方法,一个是sort_values,它是排序方法;另一个是head,它用于读取pandas的数据集中的前3行数据。
temp09.sort_values("报销金额",ascending=False).head(3)
temp10.sort_values("报销金额",ascending=False).head(3)
结果如下:
你看,总是这三个人报销费用最多,也许该看看他们的工作是否“太”饱和,业绩有没有相应跟上,否则的话,就得好好敲打敲打他们几个了。
这里呢,为sort_values这个方法再多说几句话:
大家可能注意到了,sort_values后面的括号内,除了“报销金额”,表示我们要对"报销金额"这一列数据进行排序外,还有这个:
"ascending = False"
ascending在英语中是“上升"的意思,上面这句就表示,我们“不要”按从小到大的方式进行排序(Excel中叫降序),反之呢,如果我们写成:
"ascending = True"
那就表示我们“要”对报销金额按从小到大的方式进行排序(升序)。
python的语言是不是既简洁又符合我们自然思维的方式呢?
在python中,我们把一个方法后,不管是"()",还是"{ }",还是"[ ]"中放的东东,都叫做这个方法的参数,你可以把它理解为开车时用的“档”,如果挂"R"档,就后退,如果挂“D”档,就前进。不过呢,python这辆“超跑”中的方法可以有很多种不同的“档”,用于调节你使用它们的“姿势”。
比如,这个sort_values方法,还有一个“档位”(参数),叫做"inplace",它调节的是: 排序后的结果放哪? 如果"inplace = False",则它产生一个新的结果,而“并不改变”原来的数据集,可是如果"inplace = True", 则它就是直接改变原先的数据集。默认的情况是 "inplace = False",因此,上面两条命令并没有改变原先的temp09 和 temp10这两个数据集,但你得到了你想要的结果。
这里要说明的是,不同的参数组合和方法组合,有时是有冲突的,就像油门和刹车不能同时踩一样。
还是拿上面那两条语句来举例,你如果写成这样:
temp09.sort_values("报销金额",ascending=False,inplace = True).head(3)
那么计算机就会“蒙圈”了,它将出错,执行不下去。
你得改成两条命令:
temp09.sort_values("报销金额",ascending=False,inplace = True)
temp09.head(3)
至于为什么会这样,我还没研究过pandas的代码,只知其然,不知其所以然。
下面是我的猜测:sort_values方法默认是在原数据集的基础上,产生一个新的“视图”,对视图的操作是可以按照方法排列的先后顺序进行的,而当一系列方法中,其中有一个“落实”了对原数据集的实际改变,则基于原数据集的视图就可能不复存在了,所以导致后续的方法找不到可以操作的对象。
其实我也不是胡乱猜的,是基于计算机给我报告的出错信息来进行逻辑推理所得:
一般来说,“NoneType Object”, 就是提示你这个object(对象)很可能是个空的东西。
视图就这个概念,没学过计算机编程的同学可能不太好理解,我打个比方:
还是拿大家熟悉的办公室场景来举例,比如你领到任务,要给部门500多号人重新安排座位,有若干若干要求。
一般来说,领到任务后你不会马上就张罗着让大家挪位置,正常的做法,是:你至少要拿张纸,把现在大家坐的位置先描出来,那这张纸上描画的大家现在坐的位置,其实就是办公室座位的一个“视图”;然后,你会按照领导提的若干要求,基于这个“视图”,规划新的座位,对着这张纸,你可以随时涂改、重排,都不会影响大家正常的工作,一旦确定好,你就去安排同事们搬家,搬完了之后,你基于原座位的那个图其实就已经作废了,再要找出占地方最多的小组在哪个位置,你得在新的座位图上去找了。
这样讲解,不知大家是否就能理解了呢?
任何编程语言都不能让你随心所欲,遇到问题时,首先不要从自己的惯性思维出发,觉得“理不通”,要多注意观察计算机给你的提示信息,想想可能的原因,然后去试验新的方法才是解决问题之道。
每种计算机编程语言都它的局限性,因为这些局限性,就产生了很多的语言规则。我们能做的,就是“到哪座山上,唱哪座山的歌”,了解这些限制和规则,并适应它,让它为我所用,就可以了。
今天就先总结到这儿,不知大家看了我今天的学习笔记,有没有一点点收获呢?
如果有啥问题,可在公众号后台给我留言,在我能力圈内的,尽快给大家回复。
下篇预告:
如何用python读取一个excel文件中多个不同sheet页的数据并进行处理。