1. 程式人生 > >pandas——Merge做表之間的連線

pandas——Merge做表之間的連線

基於某個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