版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013317445/article/details/86354243
基于某个column或某些columns做连接
连接时有4种方法how = [‘left’, ‘right’, ‘outer’, ‘inner’],默认值how=‘inner’
how=‘inner’ 默认值,内连接(sql中的自然连接)。按参数on的值交,其实就是键的交集(数据块系统概论54页,详细)
how=‘outer’ 外连接,按参数on的值并,并了之后其他特征上没有值的会NaN补
how=‘left’ 左连接,是以第一个 DataFrame 为主进行的连接,第二个DataFrame作为补充
how=‘right’ 右连接,是以第二个 DataFrame 为主进行的连接,第一个DataFrame作为补充
一个公共column
import pandas as pd
特殊:公共属性:key , 很巧,两个key的值(数量、内容)一模一样,那就很简单了,四种连接方式结果一模一样
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)
print ( right)
A B key
0 A0 B0 K0
1 A1 B1 K1
2 A2 B2 K2
3 A3 B3 K3
C D key
0 C0 D0 K0
1 C1 D1 K1
2 C2 D2 K2
3 C3 D3 K3
pd. merge( left, right, on= 'key' )
A
B
key
C
D
0
A0
B0
K0
C0
D0
1
A1
B1
K1
C1
D1
2
A2
B2
K2
C2
D2
3
A3
B3
K3
C3
D3
一般情况下为:公共column: key,两个表的key的值(数量、内容)不一样
一般情况下: 公共属性:key ,两个key的值不一样
key的交集:[k0, k1] left1中的悬浮元组为:(A2, K2, K2) left2中的悬浮元组为:(C4, D4, K4)
内连接:舍弃所有的悬浮元组,之后做连接 外连接:保留所有的悬浮元组,做连接,没值属性的补空NaN 左连接:只保留左表left的悬浮元组,做连接,右表上没值属性补NaN 右连接:只保留右表right的悬浮元组,做连接,左表上没值属性补NaN
看例子:
left1 = pd. DataFrame( { 'key' : [ 'K0' , 'K1' , 'K2' ] ,
'A' : [ 'A0' , 'A1' , 'A2' ] ,
'B' : [ 'B0' , 'B1' , 'B2' ] } )
right1 = pd. DataFrame( { 'key' : [ 'K0' , 'K1' , 'K1' , 'K4' ] ,
'C' : [ 'C0' , 'C1' , 'C10' , 'C4' ] ,
'D' : [ 'D0' , 'D1' , 'D10' , 'D4' ] } )
print ( left1)
print ( right1)
A B key
0 A0 B0 K0
1 A1 B1 K1
2 A2 B2 K2
C D key
0 C0 D0 K0
1 C1 D1 K1
2 C10 D10 K1
3 C4 D4 K4
pd. merge( left1, right1, on= 'key' )
A
B
key
C
D
0
A0
B0
K0
C0
D0
1
A1
B1
K1
C1
D1
2
A1
B1
K1
C10
D10
pd. merge( left1, right1, on= 'key' , how= 'outer' )
A
B
key
C
D
0
A0
B0
K0
C0
D0
1
A1
B1
K1
C1
D1
2
A1
B1
K1
C10
D10
3
A2
B2
K2
NaN
NaN
4
NaN
NaN
K4
C4
D4
pd. merge( left1, right1, on= 'key' , how= 'left' )
A
B
key
C
D
0
A0
B0
K0
C0
D0
1
A1
B1
K1
C1
D1
2
A1
B1
K1
C10
D10
3
A2
B2
K2
NaN
NaN
pd. merge( left1, right1, on= 'key' , how= 'right' )
A
B
key
C
D
0
A0
B0
K0
C0
D0
1
A1
B1
K1
C1
D1
2
A1
B1
K1
C10
D10
3
NaN
NaN
K4
C4
D4
两个公共columns,看看结果
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)
print ( right)
A B key1 key2
0 A0 B0 K0 K0
1 A1 B1 K0 K1
2 A2 B2 K1 K0
3 A3 B3 K2 K1
C D key1 key2
0 C0 D0 K0 K0
1 C1 D1 K1 K0
2 C2 D2 K1 K0
3 C3 D3 K2 K0
注意left和right的[key1,key2]的值有所不同
pd. merge( left, right, on= [ 'key1' , 'key2' ] )
A
B
key1
key2
C
D
0
A0
B0
K0
K0
C0
D0
1
A2
B2
K1
K0
C1
D1
2
A2
B2
K1
K0
C2
D2
pd. merge( left, right, on= [ 'key1' , 'key2' ] , how= 'outer' )
A
B
key1
key2
C
D
0
A0
B0
K0
K0
C0
D0
1
A1
B1
K0
K1
NaN
NaN
2
A2
B2
K1
K0
C1
D1
3
A2
B2
K1
K0
C2
D2
4
A3
B3
K2
K1
NaN
NaN
5
NaN
NaN
K2
K0
C3
D3
pd. merge( left, right, on= [ 'key1' , 'key2' ] , how= 'left' )
A
B
key1
key2
C
D
0
A0
B0
K0
K0
C0
D0
1
A1
B1
K0
K1
NaN
NaN
2
A2
B2
K1
K0
C1
D1
3
A2
B2
K1
K0
C2
D2
4
A3
B3
K2
K1
NaN
NaN
pd. merge( left, right, on= [ 'key1' , 'key2' ] , how= 'right' )
A
B
key1
key2
C
D
0
A0
B0
K0
K0
C0
D0
1
A2
B2
K1
K0
C1
D1
2
A2
B2
K1
K0
C2
D2
3
NaN
NaN
K2
K0
C3
D3