温馨提示:手机横屏阅读本文,体验更好
今天要讲的是:
应用mergey方法的各种姿势
先回顾一下:
上篇我们讲了一个最简单的例子,通过merge方法实现excel中的vlookup等函数的功能,组合不同数据源进行分析。
但是,现实工作中的数据没这么简单,比如,一个公司中同名同姓的同事可能有好多,像这样的:
如果只按昨天那样简单地组合,就会造成重复的数据,因为merge方法的结果是两个数据集的笛卡尔积(已经忘了线性代数的同学可以再温习一下)。
但这是数据源的问题,并不是merge方法的问题,基于上面的数据源,在excel中,用vlookup函数也是没法得到正确结果的。
所以在基于数据管理的现代企业中,数据架构师这个职位非常重要,一个合格的数据架构师不会允许这样的事情发生(像这种低级错误,普通人也不会犯),他必须精通业务,善于与管理层和业务部门沟通,对业务的发展及管理的需求能全面考虑,而且要有一定的前瞻性,即管理层暂时没想到的合理“拔高”需求,他也要能考虑到,同时,在设计数据库结构时,必须兼顾效率与弹性,如果只图一时的方便和简单,后患无穷。
这里,讲个我听来的案例,某企业在做年度预算案时,管理层提了个新的预算约束条件,要求来年的“客户界面费用”要增长*Pct,而“管理界面费用”要下降*Pct。
可是,可是,可是
高层领导一拍脑袋提的这个要求,没有数据源的支持啊,得靠财务人员从多个字段去判断费用的归属,如果字段是清晰定义的枚举类型,还好说,如果含有备注字段,它们记录的文字信息,财务得一条条去读备注,来判断每一笔费用的归属。一年的费用记录少说几千条,有的大部门则是十几万条、上百万条,那情景可以想象一下,我语文不好,只想到一个成语:“惨绝人寰”
很多财务从业人员的颈椎病、眼病、胃病都是这样来的。
古话好像有一句,叫“主将无能,累死三军”,在现代企业管理中,如果数据架构师无能,再加上一个锐意进取的管理者,累死的很可能就是广大基层财务工作者。
最近重读林语堂著的《苏东坡传》,宋神宗在表面繁荣而实际内外交困的情形下,立志要做一代英主,听从帝师举荐,拜王安石为相,在这个“执行力”非常强的丞相主导下,一场变革的大火迅速烧遍全国,最终也顺势把北宋王朝一起烧掉了。
最初,王安石在县级地方施政绩效优良,奉调进京时,欧阳修等人对其观感也都很好,唯东坡先生的父亲苏洵看穿了他必将为国之祸,专门还写了一篇《辨奸论》,叙述自己的担忧,可惜,后事果然不幸被其料中。为政为商,管理者都不可志大才疏,需适当控制自己“伟大”的欲望,以匹配自己的才能。
好了,扯远了,下面言归正传。
要解决上面的问题,首先要做好源数据的管理,因此,两张表中,我们都加了一个“工号”字段,这个字段在企业中应该是能精准定位到每一个员工的。
现在,两张表分别长这样了:
Ok, 准备工作做完了,下面正式开始今天的总结
1、需要用到的模块
pandas
先引入这个武器:
import pandas aspd
2、准备工作:
经过整理过后的数据,放在了"test004.xlsx"中, sheet页的名称,仍是"费用"和"部门"。
3、分别读取两个sheet页中的数据,:
df = pd.read_excel("d:\\data\\test004.xlsx",sheet_name="费用")
db = pd.read_excel("d:\\data\\test004.xlsx",sheet_name="部门")
下面合并两张数据表:
dbf = pd.merge(df,db)
有些爱动脑的同学看到这个可能会叫起来,唉,两张表中都有“工号”和“姓名”,这样做,会不会又产生重复的数据啊?
事实是不会,因为merge方法会智能根据两张表中的字段名判断数据组合的姿势,上面那条语句实际上相当于把“工号”+“姓名” 两个字段联合起来操作。
即相当于这条语句:
dbf = pd.merge(df,db,on=["工号","姓名"])
如果你怀疑费用表中的“姓名”字段数据不可靠,只想用“工号”字段来进行数据组合的话,那可以写成这样:
dbf = pd.merge(df,db,on="工号")
这样,merge在组合两张表的数据时,就只会考虑把“工号”字段作为唯一的索引字段,而会把两张表都有的“姓名”字段作为数据字段来进行处理,而且会自动给这两个字段名加上后缀,以示区别,如下:
在我们的实际工作中,由于各种原因,不同来源的数据表中,可能字段的含义相同,但它们的字段名称却不一样,比如,在费用表中工号用的是中文名称“工号”,而在部门表中工号却是英文名称“employee ID”,如果这时直接组合是有问题的,merge方法需要用到两个新的参数: left_on 和 right_on,用它们分别指定两张表用来参与组合的字段:
dbf = pd.merge(df,db,left_on="工号",right_on="employee ID")
merge方法还有一些其他参数,但不常用,且涉及到数据库的专业概念,我这里就不展开讲解了,咱们以实用为主,不搞大而全的八股文。
今天就先总结到这儿,不知大家看了我今天的学习笔记,有没有一点点收获呢?
如果有啥问题,可在公众号后台给我留言,在我能力圈内的,尽快给大家回复。
下篇预告:
讨论怎么把excel中数据转换为python中的“字典”。
后续笔记将同步发表于我的“知乎”专栏:
领取专属 10元无门槛券
私享最新 技术干货