一文輕松看懂Pandas中的merge!

大家好,我是早起。
Pandas中有很多好用的函數(shù),其中就包括merge,但是如果你剛接觸可能會被各種連接繞暈,本文嘗試講清楚!
為了方便維護(hù),一般公司的數(shù)據(jù)在數(shù)據(jù)庫內(nèi)都是分表存儲的,比如用一個表存儲所有用戶的基本信息,一個表存儲用戶的消費(fèi)情況。所以,在日常的數(shù)據(jù)處理中,經(jīng)常需要將兩張表拼接起來使用,這樣的操作對應(yīng)到SQL中是join,在Pandas中則是用merge來實(shí)現(xiàn)。這篇文章就講一下merge的主要原理。
上面的引入部分說到merge是用來拼接兩張表的,那么拼接時自然就需要將用戶信息一一對應(yīng)地進(jìn)行拼接,所以進(jìn)行拼接的兩張表需要有一個共同的識別用戶的鍵(key)。總結(jié)來說,整個merge的過程就是將信息一一對應(yīng)匹配的過程,下面介紹merge的四種類型,分別為'inner'、'left'、'right'和'outer'。
inner
merge的'inner'的類型稱為內(nèi)連接,它在拼接的過程中會取兩張表的鍵(key)的交集進(jìn)行拼接。什么意思呢?下面以圖解的方式來一步一步拆解。
首先我們有以下的數(shù)據(jù),左側(cè)和右側(cè)的數(shù)據(jù)分別代表了用戶的基礎(chǔ)信息和消費(fèi)信息,連接兩張表的鍵是userid。

現(xiàn)在用'inner'的方式進(jìn)行merge
In [6]: df_1.merge(df_2,how='inner',on='userid')Out[6]:userid age payment0 a 23 20001 c 32 3500
過程圖解:
①取兩張表的鍵的交集,這里df_1和df_2的userid的交集是{a,c}

②對應(yīng)匹配

③結(jié)果

過程匯總:

相信整個過程并不難理解,上面演示的是同一個鍵下,兩個表對應(yīng)只有一條數(shù)據(jù)的情況(一個用戶對應(yīng)一條消費(fèi)記錄),那么,如果一個用戶對應(yīng)了多條消費(fèi)記錄的話,那又是怎么拼接的呢?
假設(shè)現(xiàn)在的數(shù)據(jù)變成了下面這個樣子,在df_2中,有兩條和a對應(yīng)的數(shù)據(jù):

同樣用inner的方式進(jìn)行merge:
In [12]: df_1.merge(df_2,how='inner',on='userid')Out[12]:userid age payment0 a 23 20001 a 23 5002 b 46 10003 c 32 3500
整個過程除了對應(yīng)匹配階段,其他和上面基本都是一致的。
過程圖解:
①取兩張表的鍵的交集,這里df_1和df_2的userid的交集是{a,b,c}

②對應(yīng)匹配時,由于這里的a有兩條對應(yīng)的消費(fèi)記錄,故在拼接時,會將用戶基礎(chǔ)信息表中a對應(yīng)的數(shù)據(jù)復(fù)制多一行來和右邊進(jìn)行匹配。

③結(jié)果

left 和right
'left'和'right'的merge方式其實(shí)是類似的,分別被稱為左連接和右連接。這兩種方法是可以互相轉(zhuǎn)換的,所以在這里放在一起介紹。
'left'
merge時,以左邊表格的鍵為基準(zhǔn)進(jìn)行配對,如果左邊表格中的鍵在右邊不存在,則用缺失值NaN填充。
'right'
merge時,以右邊表格的鍵為基準(zhǔn)進(jìn)行配對,如果右邊表格中的鍵在左邊不存在,則用缺失值NaN填充。
什么意思呢?用一個例子來具體解釋一下,這是演示的數(shù)據(jù)

現(xiàn)在用'left'的方式進(jìn)行merge
In [21]: df_1.merge(df_2,how='left',on='userid')Out[21]:userid age payment0 a 23 2000.01 b 46 NaN2 c 32 3500.03 d 19 NaN
過程圖解:
①以左邊表格的所有鍵為基準(zhǔn)進(jìn)行配對。圖中,因?yàn)橛冶碇械?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">e不在左表中,故不會進(jìn)行配對。

②若右表中的payment列合并到左表中,對于沒有匹配值的用缺失值NaN填充

過程匯總:

對于'right'類型的merge和'left'其實(shí)是差不多的,只要把兩個表格的位置調(diào)換一下,兩種方式返回的結(jié)果就是一樣的(),如下:
In [22]: df_2.merge(df_1,how='right',on='userid')Out[22]:userid payment age0 a 2000.0 231 c 3500.0 322 b NaN 463 d NaN 19
至于'left'和'right'中(乃至于下面將介紹的'outer')連接的鍵是一對多的情況,原理和上方的'inner'是類似的,這里便不再贅述。
outer
'outer'是外連接,在拼接的過程中它會取兩張表的鍵(key)的并集進(jìn)行拼接??次淖植粔蛑庇^,還是上例子吧!
還是使用上方用過的演示數(shù)據(jù)

這次使用'outer'進(jìn)行merge
In [24]: df_1.merge(df_2,how='outer',on='userid')Out[24]:userid age payment0 a 23.0 2000.01 b 46.0 NaN2 c 32.0 3500.03 d 19.0 NaN4 e NaN 600.0
圖解如下:
①取兩張表鍵的并集,這里是{a,b,c,d,e}

②將兩張表的數(shù)據(jù)列拼起來,對于沒有匹配到的地方,使用缺失值NaN進(jìn)行填充

能讀到這里的小伙伴想必也基本理解了merge的整個過程,總結(jié)來說,merge的不同類型區(qū)別就在于,拼接時選用的兩張表格的鍵的集合不同。關(guān)于Pandas的merge就介紹到這里!
-END-
掃碼添加早小起
1.?回復(fù)「進(jìn)群」進(jìn)入Python技術(shù)交流群
2. 回復(fù)「Python」獲得Python技術(shù)圖書
3. 回復(fù)「習(xí)題」領(lǐng)取Python數(shù)據(jù)處理200題
