import pandas as pd
轴向连接(concatenation): pd.concat()
可以沿一个轴将多个DataFrame对象连接在一起, 形成一个新的Dataframe对象 融合(merging):pd.merge()
方法可以根据一个或多个键将不同DataFrame中的行连接起来。
concat() 轴向连接
concat() 函数可以将数据根据不同的轴作进行合并
pd.concat(objs, axis=0, join='outer')
objs
: series、dataframe或者是panel构成的序列listaxis
: 需要合并链接的轴,0是行,1是列,默认是0join
:连接的方式 inner,或者outer,默认是outer
准备数据
dict1= {
'A' : [ 'A0' , 'A1' , 'A2' , 'A3' ] ,
'B' : [ 'B0' , 'B1' , 'B2' , 'B3' ] ,
'C' : [ 'C0' , 'C1' , 'C2' , 'C3' ] }
df1= pd. DataFrame( dict1)
print ( df1)
dict2= {
'B' : [ 'B0' , 'B1' , 'B2' , 'B3' ] ,
'C' : [ 'C0' , 'C1' , 'C2' , 'C3' ] ,
'D' : [ 'D0' , 'D1' , 'D2' , 'D3' ] }
df2= pd. DataFrame( dict2)
print ( df2)
合并
join的值 inner
,得到的是两表的交集
,如果是outer
,得到的是两表的并集
(1) join='outer',axis=0
当join=‘outer’,axis参数为0时,列进行并集处理,纵向表拼接,缺失值由NaN填充,并且会保留原有数据的行索引
pd. concat( [ df1, df2] , axis= 0 , join= 'outer' , sort= True )
A B C D 0 A0 B0 C0 NaN 1 A1 B1 C1 NaN 2 A2 B2 C2 NaN 3 A3 B3 C3 NaN 0 NaN B0 C0 D0 1 NaN B1 C1 D1 2 NaN B2 C2 D2 3 NaN B3 C3 D3
如果两个表的index都没有实际含义, 使用ignore_index
参数置为 true, 重新生成一个新的index
pd. concat( [ df1, df2] , axis= 0 , join= 'outer' , ignore_index= True , sort= True )
A B C D 0 A0 B0 C0 NaN 1 A1 B1 C1 NaN 2 A2 B2 C2 NaN 3 A3 B3 C3 NaN 4 NaN B0 C0 D0 5 NaN B1 C1 D1 6 NaN B2 C2 D2 7 NaN B3 C3 D3
(2) join='outer',axis=1
当join=‘outer’,axis参数为1时,行进行并集处理,横向表拼接,缺失值由NaN填充
pd. concat( [ df1, df2] , axis= 1 , join= 'outer' , sort= True )
A B C B C D 0 A0 B0 C0 B0 C0 D0 1 A1 B1 C1 B1 C1 D1 2 A2 B2 C2 B2 C2 D2 3 A3 B3 C3 B3 C3 D3
(3) join=inner, axis=0
pd. concat( [ df1, df2] , axis= 0 , join= 'inner' , ignore_index= True )
B C 0 B0 C0 1 B1 C1 2 B2 C2 3 B3 C3 4 B0 C0 5 B1 C1 6 B2 C2 7 B3 C3
merge() 融合
merge( left, right, how= 'inner' , on= None )
参数介绍
left和right, 两个要合并的DataFrame(对应的左连接和右连接) how: 连接的方式, 有inner(内连接)、left(左连接)、right(右连接)、outer(外连接), 默认为 inner on: 指的是用于连接的列索引名称, 必须存在于左右两个DataFrame中, 如果没有指定且其他参数也没有指定,则两个DataFrame列名交集作为连接键
import pandas as pd
left = pd. DataFrame( { 'key' : [ 'a' , 'b' , 'b' , 'd' ] , 'data1' : range ( 4 ) } )
print ( left)
right = pd. DataFrame( { 'key' : [ 'a' , 'b' , 'c' ] , 'data2' : range ( 3 ) } )
print ( right)
key data1
0 a 0
1 b 1
2 b 2
3 d 3
key data2
0 a 0
1 b 1
2 c 2
inner(内连接)
merge()默认做inner连接,并且使用两个DataFrame的列名交集(key)作为连接键,同样,最终连接的数据也是两个DataFramekey列数据的交集
pd. merge( left, right)
key data1 data2 0 a 0 0 1 b 1 1 2 b 2 1
outer (外连接)
当merge()做outer连接时最终连接的数据是两个DataFramekey列数据的并集,缺失的内容由NaN填充
pd. merge( left, right, on= [ 'key' ] , how= 'outer' )
key data1 data2 0 a 0.0 0.0 1 b 1.0 1.0 2 b 2.0 1.0 3 d 3.0 NaN 4 c NaN 2.0
left(左连接)
当merge()做left连接时,最终连接的数据将以left数据的链接建为准合并两个数据的列数据,缺失的内容由NaN填充
pd. merge( left, right, on= [ 'key' ] , how= 'left' )
key data1 data2 0 a 0 0.0 1 b 1 1.0 2 b 2 1.0 3 d 3 NaN
right (右连接)
当merge()做right连接时,最终连接的数据将以right数据的链接建为准合并两个数据的列数据,缺失的内容由NaN填充
pd. merge( left, right, on= [ 'key' ] , how= 'right' )
key data1 data2 0 a 0.0 0 1 b 1.0 1 2 b 2.0 1 3 c NaN 2
应用场景
例如: 现在有两张表格分别存储了9月和10月份的成交信息,那么这个时候我们就可以使用concat( )将两个表沿着0轴合并
例如: 现在有两张表格,一个是成交信息,包含订单号、金额、客户ID等信息;第二个是客户信息,包含客户ID、姓名、电话号等信息,那么这个时候我们就可以使用merge()根据客户ID将两个表合并成一个完整的表