Pandas中的merge函數類似於Excel中的Vlookup,可以實現對兩個數據表進行匹配和拼接的功能。與Excel不同之處在於merge函數有4種匹配拼接模式,分別為inner,left,right和outer模式。 其中inner為默認的匹配模式。本篇文章我們將介紹merge函數的使用方法和4種拼接模式的區別。
下面是我們准備進行拼接的兩個數據表,左邊是貸款狀態表loan_stats,右邊為用戶等級表member_grade。我們將分別用merge函數的4種匹配模式對這兩個表進行拼接。
准備工作
開始使用merge函數進行數據拼接之前先導入所需的功能庫,然后將分別讀取兩個數據表,並命名為loanstats表和member_grade表。
1
2
3
4
|
import
numpy as np
import
pandas as pd
loanstats
=
pd.DataFrame(pd.read_excel(
'loanStats.xlsx'
))
member_grade
=
pd.DataFrame(pd.read_excel(
'member_grade.xlsx'
))
|
函數功能介紹
merge函數的使用方法很簡單,以下是官方的函數功能介紹和使用說明。merge函數中第一個出現的數據表是拼接后的left部分,第二個出現的數據表是拼接后的right部分。第三個是數據匹配模 式,默認是inner模式。第四個參數on表示數據匹配所依據的字段名稱,如果這個字段名稱同時出現在兩個數據表中,那么可以省略on參數的設置,merge默認會按照兩個數據表中共有的字段名稱進行匹配和拼接。如果兩個數據表中的匹配字段名稱不一致,則需要分別在left_on和right_on參數中指明兩個表匹配字段的名稱。如果兩個數據表中沒有匹配字段,需要使用索引列進行匹配和拼接,可以對left_index和right_index參數設置為True。merge還有一些排序和其他的參數,可在需要使用時進行設置。
Inner模式匹配
inner模式是merge的默認匹配模式,我們通過下面的文氏圖來說明inner的匹配方法。Inner模式提供在loanstats和member_grade表中共有字段的匹配結果。也就是對兩個的表交集部分進行匹配和拼接。單獨只出現在一個表中的字段值不會參與匹配和拼接。
以下是使用merge函數進行拼接的代碼,因為inner是默認的拼接模式,因此也可以省略how=’inner’部分。其中第一個出現的loanstats出現在拼接后的左側,member_grade出現在拼接后的右側。拼接后的數據表中只包含兩個表的交集,因此不存在未匹配到的NaN情況。
1
|
loan_inner
=
pd.merge(loanstats,member_grade,how
=
'inner'
)
|
left模式匹配
left模式是左匹配,以左邊的數據表loanstats為基礎匹配右邊的數據表member_grade中的內容。匹配不到的內容以NaN值顯示。在Excel中就好像將Vlookup公式寫在了左邊的表中。下面的文氏圖說明了left模式的匹配方法。Left模式匹配的結果顯示了所有左邊數據表的內容,以及和右邊數據表共有的內容。
以下為使用left模式匹配並拼接后的結果,loanstats在merge函數中第一個出現,因此為左表,member_grade第二個出現,為右表。匹配模式為left模式。從結果中可以看出left匹配模式保留了一張完整的loanstats表,以此為基礎對member_grade表中的內容進行匹配。loanstats表中有兩個member_id值在member_grade中無法找到,因此grades字段顯示為NaN值。
1
|
loan_left
=
pd.merge(loanstats,member_grade,how
=
'left'
)
|
right模式匹配
第三種模式是right匹配,right與left模式正好相反,right模式是右匹配,以右邊的數據表member_grade為基礎匹配左邊的數據表loanstats。匹配不到的內容以NaN值顯示。下面通過文氏圖說明right模式的匹配方法。Right模式匹配的結果顯示了所有右邊數據表的內容,以及和左邊數據表共有的內容。
以下為使用right模式匹配拼接的結果,從結果表中可以看出right匹配模式保留了完整的member_grade表,以此為基礎對loanstats表進行匹配,在member_grade數據表中有兩個條目在loanstats數據表中無法找到,因此顯示為了NaN值。
1
|
loan_right
=
pd.merge(loanstats,member_grade,how
=
'right'
)
|
outer模式匹配
最后一種模式是outer匹配,outer模式是兩個表的匯總,將loanstats和member_grade兩個要匹配的兩個表匯總在一起,生成一張匯總的唯一值數據表以及匹配結果。
下面是使用outer模式匹配拼接的結果,其中member_id列包含了loanstats和member_grade中的唯一值,grade列顯示了對member_grade表匹配的結果,其他列則顯示了對loanstats表匹配的結果 ,無法匹配的內容以NaN值顯示。
1
|
loan_outer
=
pd.merge(loanstats,member_grade,how
=
'outer'
)
|
NaN值匹配問題
在進行數據匹配和拼接的過程中經常會遇到NaN值。這種情況下merge函數會如何處理呢?merge會將兩個數據表中的NaN值進行交叉匹配拼接,換句話說就是將loanstats表member_id列中的NaN值
分別與member_grade表中member_id列中的每一個NaN值進行匹配,然后再拼接在一張表中。下面是包含NaN值的兩張數據表進行拼接的結果,當我們使用left模式進行匹配時,loanstats作為基礎
表,其中member_id列的NaN值分別與member_grade表中member_id列的每一個NaN值進行匹配。並將匹配結果顯示在了結果表中。
1
|
loan_left
=
pd.merge(loanstats,member_grade,how
=
'left'
)
|