基于某个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作为补充
一个公共columnimport 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'])#默认:how=inner#看看效果:只保留了共同的[key1,key2] inner连接:交
| 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')#看看效果:outer连接:并 (没有值的就补NaN)
| 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')#left的key全保留,同时right在left里有的key保留
| 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 |
---|
|