【python】詳解pandas庫的df.merge函式
阿新 • • 發佈:2018-12-13
本篇詳細說明merge的應用,join 和concatenate的拼接方法的與之相似。
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
引數如下:
- left: 拼接的左側DataFrame物件
- right: 拼接的右側DataFrame物件
- on: 要加入的列或索引級別名稱。 必須在左側和右側DataFrame物件中找到。 如果未傳遞且left_index和right_index為False,則DataFrame中的列的交集將被推斷為連線鍵。
- left_on:左側DataFrame中的列或索引級別用作鍵。 可以是列名,索引級名稱,也可以是長度等於DataFrame長度的陣列。
- right_on: 左側DataFrame中的列或索引級別用作鍵。 可以是列名,索引級名稱,也可以是長度等於DataFrame長度的陣列。
- left_index: 如果為True,則使用左側DataFrame中的索引(行標籤)作為其連線鍵。 對於具有MultiIndex(分層)的DataFrame,級別數必須與右側DataFrame中的連線鍵數相匹配。
- right_index: 與left_index功能相似。
- how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 預設inner。inner是取交集,outer取並集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的話,left中出現的A會和right中出現的買一個A進行匹配拼接,如果沒有是B,在right中沒有匹配到,則會丟失。'outer’取並集,出現的A會進行一一匹配,沒有同時出現的會將缺失的部分新增缺失值。
- sort: 按字典順序通過連線鍵對結果DataFrame進行排序。 預設為True,設定為False將在很多情況下顯著提高效能。
- suffixes: 用於重疊列的字串字尾元組。 預設為(‘x’,’ y’)。
- copy: 始終從傳遞的DataFrame物件複製資料(預設為True),即使不需要重建索引也是如此。
- indicator:將一列新增到名為_merge的輸出DataFrame,其中包含有關每行源的資訊。 _merge是分類型別,並且對於其合併鍵僅出現在“左”DataFrame中的觀察值,取得值為left_only,對於其合併鍵僅出現在“右”DataFrame中的觀察值為right_only,並且如果在兩者中都找到觀察點的合併鍵,則為left_only。
1、基礎例項:
import pandas as pd
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']})
result = pd.merge(left, right, on='key')
# on引數傳遞的key作為連線鍵
result
Out[4]:
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
2、傳入的on的引數是列表:
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']})
result = pd.merge(left, right, on=['key1', 'key2'])
# 同時傳入兩個Key,此時會進行以['key1','key2']列表的形式進行對應,left的keys列表是:[['K0', 'K0'],['K0', 'K1'],['K1', 'K0'],['K2', 'K1']],
left的keys列表是:[['K0', 'K0'],['K1', 'K0'],['K1', 'K0'],['K2', 'K0']],因此會有1個['K0', 'K0']、2個['K1', 'K0']對應。
result
Out[6]:
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、Merge method 如果組合鍵沒有出現在左表或右表中,則連線表中的值將為NA。
Merge method | SQL Join Name | Description |
---|---|---|
left | LEFTOUTER JOIN | Use keys from left frame only |
right | RIGHT OUTER JOIN | Use keys from right frame only |
outer | FULL OUTER JOIN | Use union of keys from both frames |
inner | INNER JOIN | Use intersection of keys from both frames |
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# Use keys from left frame only
result
Out[34]:
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
result = pd.merge(left, right, how='right', on=['key1', 'key2'])
# Use keys from right frame only
result
Out[36]:
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
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
# Use intersection of keys from both frames
result
Out[38]:
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
-----------------------------------------------------
left = pd.DataFrame({'A' : [1,2], 'B' : [2, 2]})
right = pd.DataFrame({'A' : [4,5,6], 'B': [2,2,2]})
result = pd.merge(left, right, on='B', how='outer')
result
Out[40]:
A_x B A_y
0 1 2 4
1 1 2 5
2 1 2 6
3 2 2 4
4 2 2 5
5 2 2 6
4、傳入indicator引數 merge接受引數指示符。 如果為True,則將名為_merge的Categorical型別列新增到具有值的輸出物件:
Observation Origin | _merge value |
---|---|
Merge key only in ‘left’ frame | left_only |
Merge key only in ‘right’ frame | right_only |
Merge key in | both frames |
df1 = pd.DataFrame({'col1': [0, 1], 'col_left':['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2],'col_right':[2, 2, 2]})
pd.merge(df1, df2, on='col1', how='outer', indicator=True)
Out[44]:
col1 col_left col_right _merge
0 0.0 a NaN left_only
1 1.0 b 2.0 both
2 2.0 NaN 2.0 right_only
3 2.0 NaN 2.0 right_only
指標引數也將接受字串引數,在這種情況下,指標函式將使用傳遞的字串的值作為指標列的名稱。
pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
Out[45]:
col1 col_left col_right indicator_column
0 0.0 a NaN left_only
1 1.0 b 2.0 both
2 2.0 NaN 2.0 right_only
3 2.0 NaN 2.0 right_only
5、以index為連結鍵 需要同時設定left_index= True 和 right_index= True,或者left_index設定的同時,right_on指定某個Key。總的來說就是需要指定left、right連結的鍵,可以同時是key、index或者混合使用。
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
....: 'B': ['B0', 'B1', 'B2']},
....: index=['K0', 'K1', 'K2'])
....:
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
....: 'D': ['D0', 'D2', 'D3']},
....: index=['K0', 'K2', 'K3'])
....:
# 只有K0、K2有對應的值
pd.merge(left,right,how= 'inner',left_index=True,right_index=True)
Out[51]:
A B C D
K0 A0 B0 C0 D0
K2 A2 B2 C2 D2
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'C': ['C0', 'C1'],
'D': ['D0', 'D1']},
index=['K0', 'K1'])
result = pd.merge(left, right, left_on='key', right_index=True, how='left', sort=False)
# left_on='key', right_index=True
result
Out[54]:
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K0 C0 D0
3 A3 B3 K1 C1 D1
6、sort對連結的鍵值進行排序:
緊接著上一例,設定sort= True
result = pd.merge(left, right, left_on='key', right_index=True, how='left', sort=True)
result
Out[57]:
A B key C D
0 A0 B0 K0 C0 D0
2 A2 B2 K0 C0 D0
1 A1 B1 K1 C1 D1
3 A3 B3 K1 C1 D1
對於多重索引,目前應用較少,就不做深入學習,以後有需要再加。
總的來說,merge的應用場景是針對連結鍵來進行操作的,連結鍵可以是index或者column。但是實際應用時一定注意的是left或者right的鍵值不要重複,這樣引來麻煩。