python表格数据的合并

303 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

数据的合并

数据合并主要包括下面两种操作:

轴向连接(concatenation):pd.concat()可以沿一个轴将多个DataFrame对象连接在一起,形成一个新的DataFrame对象。

融合(merging):pd.merge()方法可以根据一个或多个键将不同DataFrame中的行连接起来。

concat()函数可以将数据根据不同的轴进行合并。我们先看一下concat()的常用参数:

  • pd.concat(objs, axis=0, join='outer')
  • axis: 需要合并连接的轴,0是行,1是列,默认是0
  • objs: series、dataframe 或者是 panel 构成的序列list
  • join:连接的方式 inner,或者outer,默认是 outer

concat()使用默认参数合并df1和df2时:

pd.concat(objs, axis=0, join='outer')

 import pandas as pd
 dict1 = {
     'A':['A0','A1','A2','A3'],
     'B':['B0','B1','B2','B3'],
     'C':['C0','C1','C2','C3']
 }
 df1 = pd.DataFrame(dict1)
 ​
 dict2 = {
     'B':['B0','B1','B2','B3'],
     'C':['C0','C1','C2','C3'],
     'D':['D0','D1','D2','D3']
 }
 df2= pd.DataFrame(dict2)
 print(df1)
 print(df2)
     A   B   C
 0  A0  B0  C0
 1  A1  B1  C1
 2  A2  B2  C2
 3  A3  B3  C3
     B   C   D
 0  B0  C0  D0
 1  B1  C1  D1
 2  B2  C2  D2
 3  B3  C3  D3
 pd.concat([df1,df2],join='outer')

image.png

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

image.png

通过上面的结果可以发现,当join='outer',axis参数为0时,列进行并集处理,纵向表拼接,缺失值由 NaN 填充,并且会保留原有数据的行索引。代码片段pd.concat(objs, axis=0, join='outer')

01.如果两个表的index都没有实际含义,使用ignore_index参数,置true,重新整理一个新的index。

02.代码实现:pd.concat([df1,df2],axis=0,join='outer',ignore_index=True)

03.当concat()的axis参数为1合并df1和df2时:

04.代码实现:pd.concat([df1,df2],axis=1,join='outer')

05.当join='outer',axis参数为1时,行进并集处理,横向表拼接,缺失值由NaN填充。

concat()的join参数为inner时合并df1和df2时:pd.concat([df1,df2],axis=0,join='inner')

通过上面的结果可以看出,如果为inner,得到的是两表的交集,如果是outer,得到的是两表的并集。

参数介绍

merge()函数通过指定连接键拼接列数据,我们先看一下

merge的常用参数:代码片段merge(left, right, how='inner', on=None)

  1. left和right:两个要合并的DataFrame
  2. how:连接方式,有inner、left 、 right 、 outer , 默为inner
  3. on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键.
 left = pd.DataFrame({
     'key':['a','b','b','d'],'data1':range(4)
 })
 ​
 right = pd.DataFrame({'key':['a','b','c'],'data2':range(3)})
 print(left)
 print(right)

当merge()使用默认参数连接两个DataFrame时:pd.merge(left, right)

merge()默认做inner连接,并且使用两个DataFrame的列名交集(key)作为连接键,同样,最终连接的数据也是两个DataFrame key列数据的交集。代码片段pd.merge(left, right)

当两个DataFrame使用做outer连接时:pd.merge(left,right,on=['key'],how='outer')

image.png

当merge()做outer连接时最终连接的数据是两个DataFramekey列数据的并集,缺失的内容由NaN填充。

当两个DataFram使用left做连接时:pd.merge(left,right,on=['key'],how='left')

当merge()做left连接时,最终连接的数据将以left数据的链接键为准合并两个数据的列数据,缺失的内容由NaN填充

那么,当merge()做right连接时,最终的链接数据是什么样呢?运行下面的代码,验证你的想法:

pd.merge(left,right,on=['key'],how='right')