為了方便維護(hù)圃验,一般公司的數(shù)據(jù)在數(shù)據(jù)庫(kù)內(nèi)都是分表存儲(chǔ)的,比如用一個(gè)表存儲(chǔ)所有用戶(hù)的基本信息缝呕,一個(gè)表存儲(chǔ)用戶(hù)的消費(fèi)情況澳窑。所以,在日常的數(shù)據(jù)處理中供常,經(jīng)常需要將兩張表拼接起來(lái)使用摊聋,這樣的操作對(duì)應(yīng)到SQL中是join
,在Pandas中則是用merge
來(lái)實(shí)現(xiàn)栈暇。這篇文章就講一下merge
的主要原理麻裁。
上面的引入部分說(shuō)到merge
是用來(lái)拼接兩張表的,那么拼接時(shí)自然就需要將用戶(hù)信息一一對(duì)應(yīng)地進(jìn)行拼接源祈,所以進(jìn)行拼接的兩張表需要有一個(gè)共同的識(shí)別用戶(hù)的鍵(key)煎源。總結(jié)來(lái)說(shuō)香缺,整個(gè)merge
的過(guò)程就是將信息一一對(duì)應(yīng)匹配的過(guò)程手销,下面介紹merge
的四種類(lèi)型,分別為'inner'
图张、'left'
锋拖、'right'
和'outer'
诈悍。
inner
merge
的'inner'
的類(lèi)型稱(chēng)為內(nèi)連接,它在拼接的過(guò)程中會(huì)取兩張表的鍵(key)的交集進(jìn)行拼接兽埃。什么意思呢侥钳?下面以圖解的方式來(lái)一步一步拆解。
首先我們有以下的數(shù)據(jù)讲仰,左側(cè)和右側(cè)的數(shù)據(jù)分別代表了用戶(hù)的基礎(chǔ)信息和消費(fèi)信息慕趴,連接兩張表的鍵是userid
。
現(xiàn)在用'inner'
的方式進(jìn)行merge
In [6]: df_1.merge(df_2,how='inner',on='userid')
過(guò)程圖解:
①取兩張表的鍵的交集鄙陡,這里df_1
和df_2
的userid
的交集是{a,c}
②對(duì)應(yīng)匹配
③結(jié)果
過(guò)程匯總:
相信整個(gè)過(guò)程并不難理解冕房,上面演示的是同一個(gè)鍵下,兩個(gè)表對(duì)應(yīng)只有一條數(shù)據(jù)的情況(一個(gè)用戶(hù)對(duì)應(yīng)一條消費(fèi)記錄)趁矾,那么耙册,如果一個(gè)用戶(hù)對(duì)應(yīng)了多條消費(fèi)記錄的話(huà),那又是怎么拼接的呢毫捣?
假設(shè)現(xiàn)在的數(shù)據(jù)變成了下面這個(gè)樣子详拙,在df_2
中,有兩條和a
對(duì)應(yīng)的數(shù)據(jù):
同樣用inner
的方式進(jìn)行merge
:
In [12]: df_1.merge(df_2,how='inner',on='userid')
整個(gè)過(guò)程除了對(duì)應(yīng)匹配階段蔓同,其他和上面基本都是一致的饶辙。
過(guò)程圖解:
①取兩張表的鍵的交集,這里df_1
和df_2
的userid
的交集是{a,b,c}
②對(duì)應(yīng)匹配時(shí)斑粱,由于這里的a
有兩條對(duì)應(yīng)的消費(fèi)記錄弃揽,故在拼接時(shí),會(huì)將用戶(hù)基礎(chǔ)信息表中a
對(duì)應(yīng)的數(shù)據(jù)復(fù)制多一行來(lái)和右邊進(jìn)行匹配则北。
③結(jié)果
left 和right
'left'
和'right'
的merge
方式其實(shí)是類(lèi)似的矿微,分別被稱(chēng)為左連接和右連接。這兩種方法是可以互相轉(zhuǎn)換的尚揣,所以在這里放在一起介紹涌矢。
'left'
merge
時(shí),以左邊表格的鍵為基準(zhǔn)進(jìn)行配對(duì)快骗,如果左邊表格中的鍵在右邊不存在娜庇,則用缺失值NaN
填充。
'right'
merge
時(shí)方篮,以右邊表格的鍵為基準(zhǔn)進(jìn)行配對(duì)思灌,如果右邊表格中的鍵在左邊不存在,則用缺失值NaN
填充恭取。
什么意思呢?用一個(gè)例子來(lái)具體解釋一下熄守,這是演示的數(shù)據(jù)
現(xiàn)在用'left'
的方式進(jìn)行merge
In [21]: df_1.merge(df_2,how='left',on='userid')
過(guò)程圖解:
①以左邊表格的所有鍵為基準(zhǔn)進(jìn)行配對(duì)蜈垮。圖中耗跛,因?yàn)橛冶碇械?code>e不在左表中,故不會(huì)進(jìn)行配對(duì)攒发。
②若右表中的payment
列合并到左表中调塌,對(duì)于沒(méi)有匹配值的用缺失值NaN
填充
過(guò)程匯總:
對(duì)于'right'
類(lèi)型的merge
和'left'
其實(shí)是差不多的,只要把兩個(gè)表格的位置調(diào)換一下惠猿,兩種方式返回的結(jié)果就是一樣的()羔砾,如下:
In [22]: df_2.merge(df_1,how='right',on='userid')
至于'left'
和'right'
中(乃至于下面將介紹的'outer'
)連接的鍵是一對(duì)多的情況,原理和上方的'inner'
是類(lèi)似的偶妖,這里便不再贅述姜凄。
outer
'outer'
是外連接,在拼接的過(guò)程中它會(huì)取兩張表的鍵(key)的并集進(jìn)行拼接趾访√恚看文字不夠直觀,還是上例子吧扼鞋!
還是使用上方用過(guò)的演示數(shù)據(jù)
這次使用'outer'
進(jìn)行merge
In [24]: df_1.merge(df_2,how='outer',on='userid')
圖解如下:
①取兩張表鍵的并集申鱼,這里是{a,b,c,d,e}
②將兩張表的數(shù)據(jù)列拼起來(lái),對(duì)于沒(méi)有匹配到的地方云头,使用缺失值NaN
進(jìn)行填充
能讀到這里的小伙伴想必也基本理解了merge
的整個(gè)過(guò)程捐友,總結(jié)來(lái)說(shuō),merge
的不同類(lèi)型區(qū)別就在于溃槐,拼接時(shí)選用的兩張表格的鍵的集合不同匣砖。關(guān)于Pandas的merge
就介紹到這里!