dataframe 合并_Python之数据合并与连接

本文作者:周聪聪

文字编辑:杨慧琳

技术总编:张学人

爬虫俱乐部将于2019年6月22日至24日河南郑州举行Stata编程技术特别训练营,此次课程的特点是零基础、案例教学、循序渐进。此次课程受河南牧业经济学院金融学院和会计学院邀请而特别定制,我们的课室还有20台机位,为回馈河南地区粉丝长期以来对我们的支持,本次课程将推出最优惠的价格面向河南省内的高校教师和学生进行小规模招生!

详细培训大纲及报名方式,请点击文末阅读原文呦~

在进行数据处理时,我们可能经常需要将数据进行合并或连接。Python的Pandas模块功能较为强大,其中的concatmerge函数能帮助我们实现数据合并与连接的功能。下面我们详细为大家介绍如何进行数据合并与连接。

⑴纵向合并—concat

concat主要用来将两个数据纵向合并,也可称为堆叠。接下来,一起来看下具体操作吧!

First,通过下面的程序生成数据集:

import pandas as pddf1=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]})

b5d2cb80dcb4c2b184b9764db1a644a7.png

2e1ba7626b349e7843726bc09c68abc0.png

可以看到,df1与df2有完全相同的列标签,通过concat进行纵向合并。程序及结果如下:

pd.concat([df1,df2]) #默认纵向合并     

13b9390e67a5b535319a401e4dd374f1.png  

但如果我们想知道纵向合并后的数据中哪些来自df1,哪些来自df2,要如何设置呢?

pd.concat([df1,df2],keys=['df1','df2'])  #添加参数key为合并后的数据添加新索引,用来区分数据

0a563574d1c522e32dfd0e35ecb010d5.png

同时,我们也可设置数据合并的方向,令axis=1,表示横向合并:

pd.concat([df1,df2],axis=1,keys=['df1','df2'])

2a602bde7cac79356591ea443e0ecf16.png

可以看到,这里的横向合并就只是将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]})

63f1c7bc47e9b3127984ee106727e84f.png

b8173d2ba5cd2e96a3491eea57adeae0.png

①设置连接方式为左连接

pd.merge(left=df3,right=df4,on='id',how='left')

在这里,我们指定连接时左边的DataFrame为df3;右边的DataFrame为df4;连接的列名为'id';连接方式为左连接。运行结果如下:

8bf72c85ec2ff60492857368de04076f.png

由于merge会自动挑选完全一致的变量用于表连接,数据集df3和df4有共同字段id。在上段程序中我们不特别指定连接列名,也能进行连接,二者结果相同。此外,由上图可以看到,设置连接方式为左连接,即以左侧合并数据df3为基准,在其基础上合并进来新的变量,而不再增加新的观测值。

②设置连接方式为右连接

pd.merge(left=df3,right=df4,how='right') 

9b1319a4951f8dc511ccdaaafd24f711.png

可以看到,设置how='right'则会以右边数据集df4为基础进行连接。

③设置连接方式为内连接

pd.merge(left=df3,right=df4,how='inner') 

5c75f52b825b14d80b3e3e65a28d44e8.png

这样,就对两个数据集都有的键的交集进行连接,在这里就是对两个数据集中id取值为3和5的观测行进行合并。

④设置连接方式为外连接

pd.merge(left=df3,right=df4,how='outer') 

6127fbfb073674ec60f9d2f31e02be0c.png

如此,就实现了对两个数据集都有的键的并集进行连接。

以上是对于键名一样的数据进行的合并。当键名不一样时如何进行合并呢?这时可添加'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]})

e6d85b003c5d90fe6eb7d05dc231dd1f.png

2bf244cfaa510f62aff7e9a52ee6a117.png

用'left_on='和'right_on='分别指定两个键名,并设置为外连接:

pd.merge(left=df5,right=df6,left_on='id1',right_on='id2',how='outer')

08aac15ca582ff0bbb7dcdde339c8b60.png

当两个数据有相同的变量名时,合并后会在两个变量名后自动打上后缀,一个是_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]})

120edbaf64238dc50169c8f59678b78d.png

82401ecfc2f8d1a2283ffa75eb1743d3.png

指定外连接,并设置连接变量为‘id‘

pd.merge(left=df7,right=df8,how='outer',on='id')

b736b7d7dc37be865acdc21b3a8453e9.png

pd.merge(left=df7,right=df8,how='outer',on='id',suffixes=('_l','_r')) #自行设置后缀名

820eb0d2a461f518d7c2477dbf6c905a.png

那么如果指定的变量存在重复值,四种合并方式有什么不同呢?以数据集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]})

32e5fd7f7097615487f7683c612c9782.png

4834b3930fe9b3c7ff3d39486bd3bc01.png

pd.merge(left=df9,right=df10,how='outer',on='id')  #指定外连接

7f85b11ebfd4b7f7fb766f7266206a7b.png

pd.merge(left=df9,right=df10,how='inner',on='id') #指定内连接

172dcc530f75576c72aa98ebc998f6db.png

pd.merge(left=df9,right=df10,how='left',on='id') #指定左连接

9eface8d312c4c6b1561bd4cddda2664.png

pd.merge(left=df9,right=df10,how='right',on='id') #指定右连接

77c55bba283b396a98bae16aa966ae0f.png

可以看到,不管使用哪种连接方式,每个取值为2的id的那一行观测值都被合并进去了,和一般连接结果并无区别。

cfd8587296c2661a70320def85e8b533.gif

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

  • Python编程技术暑期训练营报名啦!

  • Stata编程技术6月特别训练营开始招生啦!!!

    条件判断的两种简便方法

  • 经济学专业录取分数线排行榜

  • Stata爬取新浪教育高考院校库

    Pandas之数据查询与修改

  • 爬虫俱乐部推出新命令:cnar--年报数据快到碗里来

  • 用python提取pdf表格数据

    单行观测值过长?filefilter帮你自动分行

  • 你究竟有多少NB好校友?

  • 筛选文件利器——filesearch命令

  • 绘制《倚天屠龙记》地名词云图

  • Python标准库-logging模块(1)

  • 爬虫俱乐部新云端数据源启用

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

e92fece62bb5a4459bba41d89d8adcd7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值