Python之数据合并与连接
本文作者:周聪聪
文字编辑:杨慧琳
技术总编:张学人
爬虫俱乐部将于2019年6月22日至24日在河南郑州举行Stata编程技术特别训练营,此次课程的特点是零基础、案例教学、循序渐进。此次课程受河南牧业经济学院金融学院和会计学院邀请而特别定制,我们的课室还有20台机位,为回馈河南地区粉丝长期以来对我们的支持,本次课程将推出最优惠的价格面向河南省内的高校教师和学生进行小规模招生!
详细培训大纲及报名方式,请点击文末阅读原文呦~
在进行数据处理时,我们可能经常需要将数据进行合并或连接。Python的Pandas模块功能较为强大,其中的concat和merge函数能帮助我们实现数据合并与连接的功能。下面我们详细为大家介绍如何进行数据合并与连接。
⑴纵向合并—concat
concat主要用来将两个数据纵向合并,也可称为堆叠。接下来,一起来看下具体操作吧!
First,通过下面的程序生成数据集:
import pandas as pd
df1=pd.DataFrame({'id':[1,2,3],'name':['张三','李四','小红'],'age':[21,26,23],'score':[90,89,63]})
df2=pd.DataFrame({'id':[4,5,6],'name':['小明','小青','小白'],'age':[20,25,21],'score':[79,78,66]})
可以看到,df1与df2有完全相同的列标签,通过concat进行纵向合并。程序及结果如下:
pd.concat([df1,df2]) #默认纵向合并
但如果我们想知道纵向合并后的数据中哪些来自df1,哪些来自df2,要如何设置呢?
pd.concat([df1,df2],keys=['df1','df2']) #添加参数key为合并后的数据添加新索引,用来区分数据
同时,我们也可设置数据合并的方向,令axis=1,表示横向合并:
pd.concat([df1,df2],axis=1,keys=['df1','df2'])
可以看到,这里的横向合并就只是将df1和df2横向拼接在一起。合并效果并不理想。那么如何设置左右连接的键进行精准连接呢?这就需要用到merge函数了。
⑵横向合并—merge
下面,我们就来详细介绍下这一函数。其中重点为大家介绍数据合并方式:左连接(left)、右连接(right)、内连接(inner)和外连接(outer)。
首先,生成df3和df4:
df3=pd.DataFrame({'id':[1,2,3,5],'name':['张三','李四','小红','小青'],'age':[21,26,23,25]})
df4=pd.DataFrame({'id':[3,5,6],'score':[63,78,66]})
①设置连接方式为左连接
pd.merge(left=df3,right=df4,on='id',how='left')
在这里,我们指定连接时左边的DataFrame为df3;右边的DataFrame为df4;连接的列名为'id';连接方式为左连接。运行结果如下:
由于merge会自动挑选完全一致的变量用于表连接,数据集df3和df4有共同字段id。在上段程序中我们不特别指定连接列名,也能进行连接,二者结果相同。此外,由上图可以看到,设置连接方式为左连接,即以左侧合并数据df3为基准,在其基础上合并进来新的变量,而不再增加新的观测值。
②设置连接方式为右连接
pd.merge(left=df3,right=df4,how='right')
可以看到,设置how='right'则会以右边数据集df4为基础进行连接。
③设置连接方式为内连接
pd.merge(left=df3,right=df4,how='inner')
这样,就对两个数据集都有的键的交集进行连接,在这里就是对两个数据集中id取值为3和5的观测行进行合并。
④设置连接方式为外连接
pd.merge(left=df3,right=df4,how='outer')
如此,就实现了对两个数据集都有的键的并集进行连接。
以上是对于键名一样的数据进行的合并。当键名不一样时如何进行合并呢?这时可添加'left_on='和'right_on='。具体程序如下:
df5=pd.DataFrame({'id1':[1,2,3,5],'name':['张三','李四','小红','小青'],'age':[21,26,23,25]})
df6=pd.DataFrame({'id2':[3,5,6],'score':[63,78,66]})
用'left_on='和'right_on='分别指定两个键名,并设置为外连接:
pd.merge(left=df5,right=df6,left_on='id1',right_on='id2',how='outer')
当两个数据有相同的变量名时,合并后会在两个变量名后自动打上后缀,一个是_x,一个是_y。也可以使用'suffixes=()'选项自己加后缀。首先生成数据集df7,df8:
df7=pd.DataFrame({'id':[1,2,3,5],'name':['张三','李四','小红','小青'],'score':[63,78,66,90]})
df8=pd.DataFrame({'id':[2,5,6],'score':[79,68,98]})
指定外连接,并设置连接变量为‘id‘
pd.merge(left=df7,right=df8,how='outer',on='id')
pd.merge(left=df7,right=df8,how='outer',on='id',suffixes=('_l','_r')) #自行设置后缀名
那么如果指定的变量存在重复值,四种合并方式有什么不同呢?以数据集df9和df10为例(其中df10的变量id中有两个取值为2的数据):
df9=pd.DataFrame({'id':[1,2,5],'name':['张三','李四','小青'],'score':[63,78,90]})
df10=pd.DataFrame({'id':[2,2,5,6],'score':[79,99,68,98]})
pd.merge(left=df9,right=df10,how='outer',on='id') #指定外连接
pd.merge(left=df9,right=df10,how='inner',on='id') #指定内连接
pd.merge(left=df9,right=df10,how='left',on='id') #指定左连接
pd.merge(left=df9,right=df10,how='right',on='id') #指定右连接
可以看到,不管使用哪种连接方式,每个取值为2的id的那一行观测值都被合并进去了,和一般连接结果并无区别。
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。