查看原文
其他

pandas数据处理之合并与拼接

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:金点,中南财经政法大学金融学院

本文编辑:周一鸣

技术总编:李婷婷

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
在数据处理的过程中,我们常常需要将多张表格进行合并或者拼接。下面,笔者详细为大家介绍如何使用Python中的append、concatmergejoin函数进行数据合并与连接。


1. append


语法
DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=False)  将other的行附加到调用者的末尾,返回一个新对象。

[出处](https://github.com/pandas-dev/pandas/blob/v1.5.1/pandas/core/frame.py#L9645-L9755)

参数

other:DataFrame或Series/dict类对象,或这些对象的list需要添加的数据

ignore_index:布尔值,默认为False;如果为True,结果轴将被标记为0, 1, …, n - 1。

verify_integrity:布尔值,默认为False;如果为True,则在使用副本创建索引时引发ValueError异常。

sort:布尔值,默认为False;如果self和other的列没有对齐,则对列进行排序。

Returns:DataFrame,一个新的DataFrame,由调用者的行和other的行组成。


Notes

如果传递了一个字典/系列列表,并且键都包含在DataFrame的索引中,则结果DataFrame中的列顺序将保持不变。

在DataFrame中迭代添加行比单个concatenate计算量更大。更好的办法是将这些行附加到列表中,然后将列表与原始的DataFrame一起连接起来。


一起来看具体操作吧!首先,通过下面的程序生成数据集:
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,100]})

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

需要特别注意的是,与concat相比,append的计算量更大,但concat的效率更高。


2. concat

语法
pd.concat([data1, data2], axis=1)按照行或列进行合并,axis=0为列索引,axis=1为行索引


接下来,继续使用前述生成的数据集进行具体操作吧!我们使用concat纵向合并,程序及结果如下:
pd.concat([df1,df2]) #默认纵向合并

可以看出使用concat和使用append进行纵向合并的结果相同。但如果我们想知道纵向合并后的数据中哪些来自df1,哪些来自df2,要如何设置呢?
pd.concat([df1,df2],keys=['df1','df2']) #添加参数key为合并后的数据添加新索引,用来区分数据

此外,我们也可设置数据合并的方向,令axis=1,表示横向合并:
pd.concat([df1,df2],axis=1,keys=['df1','df2'])

可以看到,上述合并仅将df1和df2进行简单横向拼接。那么,如何设置共同键进行匹配呢?这就需要用到merge函数。


3. merge

语法
pd.merge(left, right, how='inner', on=None)
  • 可以指定按照两组数据的共同键值对合并或者左右各自
  • left: DataFrame
  • right: 用以匹配的DataFrame
  • on: 指定的共同键
  • how:按照什么方式连接

在连接方式上,pandas主要有以下5种:

连接方式备注
左连接left仅保留左表的记录
右连接right仅保留右表的记录
外连接outer保留两个表的所有记录
内连接inner仅保留两表共同的记录
笛卡尔连接cross两表中的数据集交叉匹配,生成笛卡尔积

在具体操作中,首先生成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,100]})

设置连接方式为左连接

pd.merge(left=df3,right=df4,on='id',how='left')
在这里,我们指定左表为df3,右表为df4,共同键为id,连接方式为左连接。运行结果如下:

注意,在该示例中,我们指定共同字段id用以匹配。实际上,merge会自动挑选名称一致的变量用于表连接,此时不设置参数on也能成功连接。如上图所示,左连接即以左侧合并数据df3为基准,在其基础上合并新变量,而不再增加新的观测值。  
设置连接方式为右连接
pd.merge(left=df3,right=df4,how='right')
右连接结果如下图所示,即以右表df4为基准进行连接。

设置连接方式为内连接
pd.merge(left=df3,right=df4,how='inner') 
内连接结果如下图所示,保留了左表和右表共同键的交集,即id取值为3和5的观测记录。

设置连接方式为外连接
pd.merge(left=df3,right=df4,how='outer')
外连接保留了两个数据集所有的观测记录。

tips:当键名不一样时可添加left_onright_on参数进行设置。
首先,生成df5和df6,其共同键分别命名为id1和id2。
df5=pd.DataFrame({'id1':[1,2,3,5],'name':['张三','李四','王五','小红'],'age':[21,26,23,25]})df6=pd.DataFrame({'id2':[3,5,6],'score':[63,78,100]})

分别指定左右键名,并设置为外连接:
pd.merge(left=df5,right=df6,left_on='id1',right_on='id2',how='outer')

当两个数据有相同的变量名时,合并自动添加后缀,左表后缀为_x,右表后缀为_y。也可以使用suffixes参数手动设置后缀。具体程序与结果如下所示:  
df7=pd.DataFrame({'id':[1,2,3,5],'name':['张三','李四','王五','小红'],'score':[90,89,63,78]})df8=pd.DataFrame({'id':[2,5,6],'score':[83,86,92]})
pd.merge(left=df7,right=df8,how='outer',on='id') #默认后缀名为_x, _ypd.merge(left=df7,right=df8,how='outer',on='id',suffixes=('_l','_r')) #自行设置后缀名



4.join

mergejoin作为Pandas中常用的数据融合方法,目的都是将两个数据表通过共同字段进行匹配。
语法
left.join(right, on=None, how='left', lsuffix='', rsuffix='', sort=False)join的参数比merge更简单易懂,且各参数的含义和用法与merge基本一致。事实上,joinmerge的简化版本,其全部操作均可以使用merge实现。为方便使用,我们推荐大家使用merge而非join。在这里,我们不再对join进行深入介绍,有需要的读者可以查阅pandas官网。
END


重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!







往期推文推荐 

爬虫俱乐部新命令:cnkchart帮你绘制股票K线图!

Python常见内置函数(一)Stata绘图系列——饼形图绘制【爬虫实战】深交所服务业年报数据

“挂羊头卖狗肉”?

Python与excel交互--xlsxwriter模块

cnmapsearch——离公司最近的快餐店在哪

Python中的异常处理 Python交互式数据可视化——酷炫的Altair库 hk系列命令(3)—— hktrade hk系列命令(2)—— hkar hk系列命令(1)—— hkstock 超好用的字符串方法 基于Python的假设检验实现Stata与MySQL交互--基础操作 Jupyter Notebook中的魔术命令《Stata正则表达式》由中国金融出版社出版发行   匿名函数lambda到底怎么用?
     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存