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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。