pandas——Merge做表之間的連線
阿新 • • 發佈:2019-01-13
基於某個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'])
#預設: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 |