Python3 pandas.concat的用法说明
前面给大家分享了pandas.merge用法详解,这节分享pandas数据合并处理的姊妹篇,pandas.concat用法详解,参考利用Python进行数据分析与pandas官网进行整理。
pandas.merge参数列表如下图,其中只有objs是必须得参数,另外常用参数包括objs、axis、join、keys、ignore_index。
1.pd.concat([df1,df2,df3]),默认axis=0,在0轴上合并。
2.pd.concat([df1,df4],axis=1)–在1轴上合并
3.pd.concat([df1,df2,df3],keys=[‘x',‘y',‘z'])–合并时便于区分建立层次化索引。
4.pd.concat([df1,df4],axis=1,join=‘inner')–采用内连接合并,join默认为outer外连接。
5.pd.concat([df1,df4],ignore_index=True)–当原来DataFrame的索引没有意义的时候,concat之后可以不需要原来的索引。
姊妹篇:pandas.merge用法详解!!!
补充:python3:pandas(合并concat和merge)
pandas处理多组数据的时候往往会要用到数据的合并处理,其中有三种方式,concat、append和merge。
1、concat
用concat是一种基本的合并方式。而且concat中有很多参数可以调整,合并成你想要的数据形式。axis来指明合并方向。axis=0是预设值,因此未设定任何参数时,函数默认axis=0。(0表示上下合并,1表示左右合并)
importpandasaspd importnumpyasnp #定义资料集 df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d']) df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d']) df3=pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d']) #concat纵向合并 res=pd.concat([df1,df2,df3],axis=0) #打印结果 print(res) ''' abcd 00.00.00.00.0 10.00.00.00.0 20.00.00.00.0 01.01.01.01.0 11.01.01.01.0 21.01.01.01.0 02.02.02.02.0 12.02.02.02.0 22.02.02.02.0 '''
上述index为0,1,2,0,1,2形式。为什么会出现这样的情况,其实是仍然按照合并前的index组合起来的。若希望递增,请看下面示例:
ignore_index(重置index)
重置后的index为0,1,……8
res=pd.concat([df1,df2,df3],axis=0,ignore_index=True)#将ignore_index设置为True print(res)#打印结果 ''' abcd 00.00.00.00.0 10.00.00.00.0 20.00.00.00.0 31.01.01.01.0 41.01.01.01.0 51.01.01.01.0 62.02.02.02.0 72.02.02.02.0 82.02.02.02.0 '''
join(合并方式)
join='outer'为预设值,因此未设定任何参数时,函数默认join='outer'。此方式是依照column来做纵向合并,有相同的column上下合并在一起,其他独自的column个自成列,原本没有值的位置皆以NaN填充。
importpandasaspd importnumpyasnp #定义资料集 df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3]) df2=pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'],index=[2,3,4]) res=pd.concat([df1,df2],axis=0,join='outer')#纵向"外"合并df1与df2 print(res) ''' abcde 10.00.00.00.0NaN 20.00.00.00.0NaN 30.00.00.00.0NaN 2NaN1.01.01.01.0 3NaN1.01.01.01.0 4NaN1.01.01.01.0 ''' res=pd.concat([df1,df2],axis=0,join='inner')#纵向"内"合并df1与df2 #打印结果 print(res) ''' bcd 10.00.00.0 20.00.00.0 30.00.00.0 21.01.01.0 31.01.01.0 41.01.01.0 '''
join_axes(依照axes合并)
importpandasaspd importnumpyasnp #定义资料集 df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3]) df2=pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'],index=[2,3,4]) #依照`df1.index`进行横向合并 res=pd.concat([df1,df2],axis=1,join_axes=[df1.index]) #打印结果 print(res) #abcdbcde #10.00.00.00.0NaNNaNNaNNaN #20.00.00.00.01.01.01.01.0 #30.00.00.00.01.01.01.01.0
上述脚本中,join_axes=[df1.index]表明按照df1的index来合并,可以看到结果中去掉了df2中出现但df1中没有的index=4这一行。
2、append(添加数据)
append只有纵向合并,没有横向合并。
importpandasaspd importnumpyasnp #定义资料集 df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d']) df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d']) df3=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d']) s1=pd.Series([1,2,3,4],index=['a','b','c','d']) #将df2合并到df1的下面,以及重置index,并打印出结果 res=df1.append(df2,ignore_index=True) print(res) #abcd #00.00.00.00.0 #10.00.00.00.0 #20.00.00.00.0 #31.01.01.01.0 #41.01.01.01.0 #51.01.01.01.0 #合并多个df,将df2与df3合并至df1的下面,以及重置index,并打印出结果 res=df1.append([df2,df3],ignore_index=True) print(res) #abcd #00.00.00.00.0 #10.00.00.00.0 #20.00.00.00.0 #31.01.01.01.0 #41.01.01.01.0 #51.01.01.01.0 #61.01.01.01.0 #71.01.01.01.0 #81.01.01.01.0 #合并series,将s1合并至df1,以及重置index,并打印出结果 res=df1.append(s1,ignore_index=True) print(res) #abcd #00.00.00.00.0 #10.00.00.00.0 #20.00.00.00.0 #31.02.03.04.0
3、merge
根据两组数据中的关键字key来合并(key在两组数据中是完全一致的)。
3.1依据一组key合并
importpandasaspd #定义资料集并打印出 left=pd.DataFrame({'key':['K0','K1','K2','K3'], 'A':['A0','A1','A2','A3'], 'B':['B0','B1','B2','B3']}) right=pd.DataFrame({'key':['K0','K1','K2','K3'], 'C':['C0','C1','C2','C3'], 'D':['D0','D1','D2','D3']}) print(left) #ABkey #0A0B0K0 #1A1B1K1 #2A2B2K2 #3A3B3K3 print(right) #CDkey #0C0D0K0 #1C1D1K1 #2C2D2K2 #3C3D3K3 #依据keycolumn合并,并打印出 res=pd.merge(left,right,on='key') print(res) ABkeyCD #0A0B0K0C0D0 #1A1B1K1C1D1 #2A2B2K2C2D2 #3A3B3K3C3D3
3.2根据两组key合并
合并时有4种方法how=['left','right','outer','inner'],预设值how='inner'。
inner:按照关键字组合之后,去掉组合中有合并项为NaN的行。
outer:保留所有组合
left:仅保留左边合并项为NaN的行
right:仅保留右边合并项为NaN的行
importpandasaspd importnumpyasnp #定义资料集并打印出 left=pd.DataFrame({'key1':['K0','K0','K1','K2'], 'key2':['K0','K1','K0','K1'], 'A':['A0','A1','A2','A3'], 'B':['B0','B1','B2','B3']}) right=pd.DataFrame({'key1':['K0','K1','K1','K2'], 'key2':['K0','K0','K0','K0'], 'C':['C0','C1','C2','C3'], 'D':['D0','D1','D2','D3']}) print(left) ''' key1key2AB 0K0K0A0B0 1K0K1A1B1 2K1K0A2B2 3K2K1A3B3 ''' print(right) ''' key1key2CD 0K0K0C0D0 1K1K0C1D1 2K1K0C2D2 3K2K0C3D3 ''' #依据key1与key2columns进行合并,并打印出四种结果['left','right','outer','inner'] res=pd.merge(left,right,on=['key1','key2'],how='inner') print(res) ''' key1key2ABCD 0K0K0A0B0C0D0 1K1K0A2B2C1D1 2K1K0A2B2C2D2 ''' res=pd.merge(left,right,on=['key1','key2'],how='outer') print(res) ''' key1key2ABCD 0K0K0A0B0C0D0 1K0K1A1B1NaNNaN 2K1K0A2B2C1D1 3K1K0A2B2C2D2 4K2K1A3B3NaNNaN 5K2K0NaNNaNC3D3 ''' res=pd.merge(left,right,on=['key1','key2'],how='left') print(res) ''' key1key2ABCD 0K0K0A0B0C0D0 1K0K1A1B1NaNNaN 2K1K0A2B2C1D1 3K1K0A2B2C2D2 4K2K1A3B3NaNNaN ''' res=pd.merge(left,right,on=['key1','key2'],how='right') print(res) ''' key1key2ABCD 0K0K0A0B0C0D0 1K1K0A2B2C1D1 2K1K0A2B2C2D2 3K2K0NaNNaNC3D3 '''
3.3Indicator
indicator=True会将合并的记录放在新的一列。
importpandasaspd #定义资料集并打印出 df1=pd.DataFrame({'col1':[0,1],'col_left':['a','b']}) df2=pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]}) print(df1) #col1col_left #00a #11b print(df2) #col1col_right #012 #122 #222 #依据col1进行合并,并启用indicator=True,最后打印出 res=pd.merge(df1,df2,on='col1',how='outer',indicator=True) print(res) #col1col_leftcol_right_merge #00.0aNaNleft_only #11.0b2.0both #22.0NaN2.0right_only #32.0NaN2.0right_only #自定indicatorcolumn的名称,并打印出 res=pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column') print(res) #col1col_leftcol_rightindicator_column #00.0aNaNleft_only #11.0b2.0both #22.0NaN2.0right_only #32.0NaN2.0right_only
3.4依据index合并
importpandasaspd #定义资料集并打印出 left=pd.DataFrame({'A':['A0','A1','A2'], 'B':['B0','B1','B2']}, index=['K0','K1','K2']) right=pd.DataFrame({'C':['C0','C2','C3'], 'D':['D0','D2','D3']}, index=['K0','K2','K3']) print(left) #AB #K0A0B0 #K1A1B1 #K2A2B2 print(right) #CD #K0C0D0 #K2C2D2 #K3C3D3 #依据左右资料集的index进行合并,how='outer',并打印出 res=pd.merge(left,right,left_index=True,right_index=True,how='outer') print(res) #ABCD #K0A0B0C0D0 #K1A1B1NaNNaN #K2A2B2C2D2 #K3NaNNaNC3D3 #依据左右资料集的index进行合并,how='inner',并打印出 res=pd.merge(left,right,left_index=True,right_index=True,how='inner') print(res) #ABCD #K0A0B0C0D0 #K2A2B2C2D2
3.5解决overlapping的问题
下面脚本中,boys和girls均有属性age,但是两者值不同,因此需要在合并时加上后缀suffixes,以示区分。
importpandasaspd #定义资料集 boys=pd.DataFrame({'k':['K0','K1','K2'],'age':[1,2,3]}) girls=pd.DataFrame({'k':['K0','K0','K3'],'age':[4,5,6]}) #使用suffixes解决overlapping的问题 res=pd.merge(boys,girls,on='k',suffixes=['_boy','_girl'],how='inner') print(res) #age_boykage_girl #01K04 #11K05
以上是pandas中有关于合并的一些操作。当然,如果练习的多了,几个方法也是大同小异。希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。