(1.27)-4-4-2数据的连接与合并_第1页
(1.27)-4-4-2数据的连接与合并_第2页
(1.27)-4-4-2数据的连接与合并_第3页
(1.27)-4-4-2数据的连接与合并_第4页
(1.27)-4-4-2数据的连接与合并_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章数据处理和分析-Pandas第10讲数据的连接与合并Contents目录01横向合并纵向合并02重叠合并04主键合并0301横向合并横向合并参数名称功能描述objs表示参与连接的对象,可以是一个序列,也可以是DataFrame或Series对象的映射。axis表示连接的轴向,0为行索引,1为列索引,默认为0。join表示其他轴向上的索引是按交集(inner)还是并集(outer)进行合并,默认为outer。ignore_index表示是否保留连接轴上的索引,并产生0,1,…,n-1的新索引。默认为False。keys表示用于连接轴上最外层的层次化索引,默认为None。levels表示用于各级别的层次化索引,可以是序列对象的列表,默认为None。names表示为keys和levels参数添加的多层次索引指定相应的名称,可以是列表对象,默认为None。verify_integrity表示是否检查新连接轴上的重复情况,如果发现则引发异常,默认为False。sort如果参数join=”outer”,则非连接轴在“联接”时尚未对齐,则对其进行排序;join=”inner”时,则不排序。默认为False。copy表示是否复制数据,默认为True。又称横向堆叠,是将两个数据子集在X轴方向进行拼接,即保持行对齐,合并各列的数据,以生成一个新的数据集。横向合并,大多使用pandas.concat()函数完成,该函数的基本语法:concat(objs,axis=0,join='outer',ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=False,copy=True)横向合并当函数concat()的参数axis=1时,可以对数据进行行对齐,然后将不同列索引的两个或多个数据子集进行横向合并。(1) 当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接。join=”inner”时,仅返回索引重叠部分,join=”outer”时,则显示索引的并集部分数据,不足的地方则使用空值填补,其原理如下图。(2) 当两张表完全一样时,不论join参数取值是inner或者outer,结果都是将两个表完全按照X轴拼接起来。横向合并横向合并示例>>>df1=pd.DataFrame({'letter':['a','b'],'number':[1,2]})>>>df4=pd.DataFrame([['bird','polly'],['monkey','george']],columns=['animal','name'])>>>pd.concat([df1,df4],axis=1)#按列方向合并数据

letter number animal name0 a 1 bird polly1 b 2 monkey george02纵向合并纵向合并又称纵向堆叠,是将数据子集按照Y轴方向进行拼接,即保持列对齐,合并各行的数据,以生成一个新的数据集。1.使用concat()函数使用concat()函数时,在默认情况下,即axis=0时,concat做列对齐,将不同行索引的两张或多张表纵向合并。(1)在两张表的列名并不完全相同的情况下,当join参数取值为inner时,返回的仅仅是列名交集所代表的列,取值为outer时,返回的是两者列名的并集所代表的列,其原理如右图。(2)不论join参数取值是inner或者outer,结果都是将两个表完全按照Y轴拼接起来。纵向合并使用concat()函数进行纵向合并示例>>>s1=pd.Series(['a','b'])#创建Series对象>>>s2=pd.Series(['c','d'])>>>pd.concat([s1,s2])#横向堆叠,返回一个新的Series对象>>>pd.concat([s1,s2],ignore_index=True)#忽略原索引,自动创建新索引>>>pd.concat([s1,s2],keys=['s1','s2'])#合并时创建分层索引,并定义外层索引的值>>>pd.concat([s1,s2],keys=['s1','s2'],names=['ObjName','RowIdx'])#定义各层索引的名称>>>df1=pd.DataFrame([['a',1],['b',2]],columns=['letter','number'])#创建DataFrame对象>>>df2=pd.DataFrame([['c',3],['d',4]],columns=['letter','number'])>>>pd.concat([df1,df2])#横向连接,保持原对象索引>>>df3=pd.DataFrame([['c',3,'cat'],['d',4,'dog']],columns=['letter','number','animal'])>>>pd.concat([df1,df3],sort=False)#连接时不改变列索引的顺序>>>pd.concat([df1,df3],join="inner")#以交集方式合并数据>>>df5=pd.DataFrame([1],index=['a'])>>>df6=pd.DataFrame([2],index=['a'])>>>pd.concat([df5,df6],verify_integrity=True)#合并时不允许索引重复,否则报错纵向合并2.使用append()函数数据子集的纵向堆叠,也可以使用DataFrame.append()方法,但append()方法实现纵向堆叠的前提条件是两个数据子集的列名需要完全一致。append()方法的基本语法如下:append(other,ignore_index=False,verify_integrity=False,sort=False)参数名称功能描述other表示要添加的新数据子集ignore_indexbool值,为True时会自动产生新索引,并忽略原数据的索引。默认为Falseverify_integritybool值,若为True且ignore_idnex为False时,则检查添加的索引是否冲突。若索引冲突,则添加数据失败。默认为False。sortbool值,若为True,在合并的数据子集列索引没有对齐时,则按列排序。默认为False。纵向合并使用append()函数进行纵向合并示例>>>df1=pd.DataFrame([[1,2],[3,4]],columns=list('AB'))>>>df1AB012134>>>df2=pd.DataFrame([[5,6],[7,8]],columns=list('AB'))>>>df2AB0561 78>>>df1.append(df2,ignore_index=True)#纵向合并,忽略原数据索引

AB01213425637803主键合并主键合并主键合并,类似于关系数据库的join方式,即通过一个或多个键将不同数据集的行连接起来。针对同一个主键存在两个包含不同列名的表,将其根据某几个列关键字一一对应拼接起来,结果集列数为两个原数据集的列数之和减去用于连接键的数量。例如,按照主键Key进行数据合并,结果如下图。主键合并1.使用merge()函数merge()函数的基本语法如下:merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True,indicator=False,validate=None)参数名称功能描述left用于合并的DataFrame对象right用于合并的DataFrame对象或命名的Series对象how设置数据合并时的连接方式,可以为”left”、”right”、”inner”、”outer”四种类型,默认为”inner”on用于连接的列或索引级别的名称或其列表,必须同时在左、右两个DataFrame中存在。若为列或索引级别名称的列表,则表示多键连接,默认以两个DataFrame列名的交集作为连接键。left_on表示左侧DataFrame作为连接键的列或索引级别名称。可以是列名、数组或与左侧DataFrame长度相等的数组的列表。right_on表示右侧DataFrame作为连接键的列或索引级别名称,同left_on。left_indexbool型,默认为False,表示是否使用left_on参数指定的行索引作为连接键。right_indexbool型,默认为False,同left_index。sortbool型,默认为False,表示是否对合并的数据按主键的字典顺序排序。suffixes字符串组成的元组,用于指定左、右DataFrame列名重复时再列名后面附加的后缀名称,默认为(’_x’,’_y’)。copybool型,表示是否将数据复制到数据结构,默认为False。indicatorbool或str类型,默认为False。若为True,则在输出的DataFrame中增加一个名为“_merge”的列,指示每一行的来源信息;若为str类型,则输出的DataFrame中增加的列信息为分类类型,可以为“left_only”、“right_only”和“both”,表明每一行的来源是否与参与合并的左右两侧的DataFrame有关。validatestr类型,可选项。用于检查数据合并时的联结类型,可以为“1:1”、“1:m”、“m:m”,即一对一、一对多、多对多的联结类型。主键合并(1)内连接:how=’inner’,使用两个表都有的键值,返回两个表的交集,即将左表与右表中键值相同的行进行匹配,键值不同的行将被舍弃。若左表和右表中没有键值相同的行存在,将返回一个空的数据集。(2)左连接:how=’left’,使用左表中所有的键值,将左表的所有行与右表中键值相同的行进行匹配。若右表中没有匹配的行,则其值为“NaN”;(3)右连接:how=’right’,使用右表中所有的键值,将右表的所有行与左表中键值相同的行进行匹配。若左表中没有匹配的行,则其值为“NaN”;(4)外连接:how=’outer’,使用两个表中所有的键值,返回两个表的并集。可以将外连接理解为是左连接和右连接的组合。使用merge()函数按主键进行数据合并时,只能同时合并两个数据子集,且合并后的数据集的列数为两个原数据子集的列数之和减去连接主键的个数。为方便起见,分别把两个数据子集称为左表和右表。其中的how参数可以用来设置左表和右表的连接方式,说明如下:主键合并(1)一对一:键值没有重复。左表与右表的键值存在一一对应的关系,连接后的结果集其行数为左表或右表的行数。(2)多对一:左表中的键值不唯一,存在重复,而右表中的键值唯一。连接时保留重复行,其结果集行数为左表的行数。(3)多对多:左表和右表的键值均不唯一。连接后的结果集为左表和右表中行的笛卡尔积,其行数为两个表行数的乘积。在将两个表按照主键进行连接时,类似于关系型数据库,表之间存在数据的一对一、多对一、多对多的关系,这也会影响连接的结果集数据的多少。主键合并使用merge()函数进行主键合并示例>>>left=pd.DataFrame({'Name':['Jobs','BillGates','Beckham'],

'Identity':['AppleInc.','Microsoft','Athlete']})>>>right=pd.DataFrame({'Name':['Jobs','BillGates','Beckham'],'Visited':[23.7,57.8,46.2]})

merge(left,right)

按主键合并数据

NameIdentity0JobsAppleInc.1BillGatesMicrosoft2BeckhamAthlete

NameVisited0Jobs23.71BillGates57.82Beckham46.2

NameIdentityVisited0JobsAppleInc.23.71BillGatesMicrosoft57.82BeckhamAthlete46.2采用默认方式,按键相同合并两个表left、right,且连接的方式为内连接,相当于参数on=”Name”、how=”inner”的情况。同时,两个表之间的联系是一对一的关系,无论采用哪一种连接方式,其结果是一样的。主键合并使用merge()函数进行主键合并示例>>>df1=pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})>>>df2=pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})merge(df1,df2,left_on='lkey',right_on='rkey')合并两个数据两个表的连接主键名称不同,但数据含义一致,可使用left_on、right_on参数分别指定连接时的主键。同时,两个表数据之间的联系呈现出多对一的关系,且数据的连接方式为内连接(inner)。因此,左表中键值为a和b的每一行将分别关联右表中对应的唯一一行。

lkeydata10b01b12a23c34a45a56b6

rkeydata20a01b12d2

lkeydata1rkeydata20b0b11b1b12b6b13a2a04a4a05a5a0主键合并使用merge()函数进行主键合并示例>>>df1=pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':np.random.randint(0,100,6)})>>>df2=pd.DataFrame({'key':['a','b','a','b','d'],'data2':np.random.randint(0,100,5)})merge(df1,df2,on='key',how='left')按左连接方式合并数据按主键key连接两个表,连接的方式为左连接(left),且数据之间的联系为多对多的关系。因此,左表中的每一行将分别关联右表中对应键值的每一行,若左表中的键值在右表中不存在时,对应的键值将置为NaN(如左表中的c),而右表中的键值在左表中不存在时将被舍弃。

keydata10b671b472a83c544a865b17

keydata20a431b432a53b454d62

keydata1data20b6743.01b6745.02b4743.03b4745.04a843.05a85.06c54NaN7a8643.08a865.09b1743.010b1745.0主键合并使用merge()函数进行主键合并示例>>>left=pd.DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'lval':[1,2,3]})>>>right=pd.DataFrame({'key1':['foo','foo','bar','bar'],

'key2':['one','one','one','two'],'rval':[4,5,6,7]})merge(left,right,on=['key1','key2'],how='outer')按多个键外连接按多个键连接合并数据,可将多个键看作为一个元组,按单个键的连接方式处理。同时,两个表数据之间的联系为多对多的关系,将连接产生行的笛卡尔积,即数据合并的结果,其行数为左表的行数与右表行数的乘积。

key1key2lval0fooone11footwo22barone3

key1key2rval0fooone41fooone52barone63bartwo7

key1key2lvalrval0fooone1.04.01fooone1.05.02footwo2.0NaN3barone3.06.04bartwoNaN7.0主键合并2.使用join()函数使用join()方法实现按主键合并时,要求两个数据子集的主键名称必须相同。join()方法也可以实现按行索引合并数据的功能。join()方法的语法如下:join(other,on=None,how='left',lsuffix='',rsuffix='',sort=False)参数名称功能描述other表示要合并的数据集,可以是DataFrame、Series或DataFrame的列表。on设置要连接的主键,可以是列名或者列名的列表或元组,默认为None。how用于设置连接的方式,可以为”inner”、”outer”、”left”、”right”,同merge函数,默认为”inner”。lsuffixstring类型,表示用于追加到左侧重叠列名末尾的后缀名称。rsuffixstring类型,表示用于追加到右侧重叠列名末尾的后缀名称。sortbool类型,表示是否根据连接键对合并后的数据进行排序,默认为True。说明:当需要join的数据是DataFrame对象的列表时,不支持传递参数on,lsuffix,sort。主键合并使用join()函数进行主键合并示例>>>df=pd.DataFrame({'key':['K0','K1','K2','K3','K4','K5'],'A':['A0','A1','A2','A3','A4','A5']})>>>other=pd.DataFrame({'key':['K0','K1','K2'],'B':['B0','B1','B2']})df.join(other,lsuffix='_caller',rsuffix='_other')按行索引进行连接join()方法默认按行索引进行数据合并,且连接方式为左连接(left)。当主键名称相同时,可以通过参数lsuffix和rsuffix指定主键具有不同的后缀名称。

keyA0K0A01K1A12K2A23K3A34K4A45K5A5

keyB0K0B01K1B12K2B2

key_callerAkey_otherB0K0A0K0B01K1A1K1B12K2A2K2B23K3A3NaNNaN4K4A4NaNNaN5K5A5NaNNaN主键合并使用join()函数进行主键合并示例>>>df=pd.DataFrame({'key':['K0','K1','K2','K3','K4','K5'],'A':['A0','A1','A2','A3','A4','A5']})>>>other=pd.DataFrame({'key':['K0','K1','K2'],'B':['B0','B1','B2']})df.set_index('key').join(other.set_index('key'))按指定的列连接使用DataFrame对象的join()方法按主键方式进行列-列合并,需要先将两个表中要作为主键的列设置为索引,然后再进行连接。此时,连接的结果中索引也是指定的列。

keyA0K0A01K1A12K2A23K3A34K4A45K5A5

keyB0K0B01K1B12K2B2

ABkey

K0A0B0K1A1B1K2A2B2K3A3NaNK4A4NaNK5A5NaN主键合并使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论