【Python】挑战SQL:图解Pandas的数据合并merge
公眾號(hào):尤而小屋
作者:Peter
編輯:Peter
在實(shí)際的業(yè)務(wù)需求中,我們的數(shù)據(jù)可能存在于不同的庫(kù)表中。很多情況下,我們需要進(jìn)行多表的連接查詢來(lái)實(shí)現(xiàn)數(shù)據(jù)的提取,通過(guò)SQL的join,比如left join、left join、inner join等來(lái)實(shí)現(xiàn)。
在pandas中也有實(shí)現(xiàn)合并功能的函數(shù),比如:concat、append、join、merge。本文中重點(diǎn)介紹的是merge函數(shù),也是pandas中最為重要的一個(gè)實(shí)現(xiàn)數(shù)據(jù)合并的函數(shù)。
看完了你會(huì)放棄SQL嗎?
Pandas連載文章
目前Pandas系列文章已經(jīng)更新了13篇,文章都是以豐富案例+圖解的風(fēng)格,歡迎大家訪問(wèn)閱讀。有很多個(gè)人推薦的文章:
圖解Pandas重復(fù)值處理
圖解Pandas的排序機(jī)制sort_values
圖解Pandas的排名rank機(jī)制
圖解Pandas的groupby機(jī)制
數(shù)據(jù)處理基石:數(shù)據(jù)探索
創(chuàng)建DataFrame:10種方式任你選
參數(shù)
官網(wǎng)學(xué)習(xí)地址:https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html#
pd.merge(left,???#?待合并的2個(gè)數(shù)據(jù)框right,?how='inner',??#?‘left’,?‘right’,?‘outer’,?‘inner’,?‘cross’on=None,?#?連接的鍵,默認(rèn)是相同的鍵left_on=None,??#?指定不同的連接字段:鍵不同,但是鍵的取值有相同的內(nèi)容right_on=None,?left_index=False,???#?根據(jù)索引來(lái)連接right_index=False,?sort=False,?#?是否排序suffixes=('_x',?'_y'),???#?改變后綴copy=True,?indicator=False,???#?顯示字段來(lái)源validate=None)參數(shù)的具體解釋為:
left、right:待合并的數(shù)據(jù)幀
how:合并的方式,有5種:{‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, 默認(rèn)是 ‘inner’
1、 left:左連接,保留left的全部數(shù)據(jù);right類似;類比于SQL的left join 或者right join
2、outer:全連接功能,類似SQL的full outer join
3、inner:交叉連接,類比于SQL的inner join
4、cross:創(chuàng)建兩個(gè)數(shù)據(jù)幀DataFrame的笛卡爾積,默認(rèn)保留左邊的順序
on:連接的列屬性;默認(rèn)是兩個(gè)DataFrame的相同字段
left_on/right_on:指定兩個(gè)不同的鍵進(jìn)行聯(lián)結(jié)
left_index、right_index:通過(guò)索引進(jìn)行合并
suffixes:指定我們自己想要的后綴
indictor:顯示字段的來(lái)源
模擬數(shù)據(jù)
我們創(chuàng)建了4個(gè)DataFrame數(shù)據(jù)框;其中df1和df2、df3是具有相同的鍵userid;df4有類似的鍵userid1,取值也是ac,和df1或df2的userid取值有相同的部分。
import?pandas?as?pd import?numpy?as?np參數(shù)left、right
left、how就是需要連接的兩個(gè)數(shù)據(jù)幀,一般有兩種寫(xiě)法:
pd.merge(left,right),個(gè)人習(xí)慣
left.merge(right)
圖解過(guò)程如下:
兩個(gè)數(shù)據(jù)框df1(left)、df2(right)有相同的字段userid
默認(rèn)是通過(guò)相同的字段(鍵)進(jìn)行關(guān)聯(lián),取出鍵中相同的值(ac),而且每個(gè)鍵的記錄要全部顯示,比如a有多條記錄
參數(shù)how
inner
inner稱之為內(nèi)連接。它會(huì)直接根據(jù)相同的列屬性u(píng)serid進(jìn)行關(guān)聯(lián),取出屬性下面相同的數(shù)據(jù)信息a、c
??上面的圖解過(guò)程就是默認(rèn)的使用how="inner"
outer
outer稱之為外連接,在拼接的過(guò)程中會(huì)取兩個(gè)數(shù)據(jù)框中鍵的并集進(jìn)行拼接
外連接,取出全部交集鍵的并集。例子中是user的并集
如果某個(gè)鍵在某個(gè)數(shù)據(jù)框中不存在數(shù)據(jù),則為NaN
圖解過(guò)程如下:
也是根據(jù)相同的字段來(lái)進(jìn)行連結(jié):userid
保留兩邊的全部數(shù)據(jù),所以abcde全部存在
如果某邊不存在鍵下面的某個(gè)值,則結(jié)果中用NaN補(bǔ)充。比如df1的userid中存在b,但是df3中不存在,則結(jié)果b對(duì)應(yīng)的score為NaN,cd類似;e在df3中存在e的取值,但是df1中不存在,則age的值為NaN
left
以左邊數(shù)據(jù)框中的鍵為基準(zhǔn);如果左邊存在但是右邊不存在,則右邊用NaN表示
圖解過(guò)程如下:
和上面圖解過(guò)程的結(jié)果差別在于,沒(méi)有出現(xiàn)e;
當(dāng)how="left",只會(huì)保留df1(left)中userid下面的全部取值,不包含e
right
以右邊數(shù)據(jù)框中的鍵的取值為基準(zhǔn);如果右邊存在但是左邊不存在,則左邊用NaN表示
image-20210724095138183圖解過(guò)程如下:
當(dāng)how="right",只會(huì)保留df3(right)中userid的全部取值
結(jié)果只保留了df3的userid下面的全部取值:a、e
cross
笛卡爾積:兩個(gè)數(shù)據(jù)框中的數(shù)據(jù)交叉匹配,出現(xiàn)n1*n2的數(shù)據(jù)量
笛卡爾積的圖解過(guò)程如下:
出現(xiàn)的數(shù)據(jù)量是4*2,userid下面的數(shù)據(jù)交叉匹配
在最終結(jié)果中相同的字段userid為了避免混淆,會(huì)帶上默認(rèn)的后綴_x、_y
參數(shù)on
如果待連接的兩個(gè)數(shù)據(jù)框有相同的鍵,則默認(rèn)使用該相同的鍵進(jìn)行聯(lián)結(jié)。
上面的所有圖解例子的參數(shù)on默認(rèn)都是使用相同的鍵進(jìn)行聯(lián)結(jié),所以有時(shí)候可省略。
再看個(gè)例子:
還可以將left和right的位置進(jìn)行互換:
上面的兩個(gè)例子都是針對(duì)數(shù)據(jù)框只有具有相同的一個(gè)鍵,如果不止通過(guò)一個(gè)鍵進(jìn)行聯(lián)結(jié),該如何處理?通過(guò)一個(gè)來(lái)自官網(wǎng)的例子來(lái)解釋,我們先創(chuàng)建兩個(gè)DataFrame:df5、df6
現(xiàn)在進(jìn)行兩個(gè)數(shù)據(jù)框的合并:
合并的圖解過(guò)程如下:
通過(guò)on參數(shù)指定兩個(gè)連接的字段key1、key2
只有當(dāng)兩個(gè)數(shù)據(jù)框中的key1和key2的取值完全相同的時(shí)候(交集),才會(huì)保留下來(lái);比如都出現(xiàn)了key1=K0,key2=K0和key1=K1,key2=K0。
在看一個(gè)通過(guò)how="outer"進(jìn)行連接的案例:
看看圖解的過(guò)程:
指定連接的兩個(gè)鍵key1、key2
使用how="outer",會(huì)保留兩個(gè)數(shù)據(jù)框中的全部數(shù)據(jù)。某個(gè)數(shù)據(jù)框中不存在鍵的值,則取NaN
參數(shù)left_on、right_on
上面在連接合并的時(shí)候,兩個(gè)數(shù)據(jù)框之前都是有相同的字段,比如userid或者key1和key2。但是如何兩個(gè)數(shù)據(jù)框中沒(méi)有相同的鍵,但是這些鍵中的取值有相同的部分,比如我們的df1、df3:
在這個(gè)時(shí)候我們就使用left_on和right_on參數(shù),分別指定兩邊連接的鍵:
如果我們不指定,系統(tǒng)就會(huì)報(bào)錯(cuò),因?yàn)檫@兩個(gè)數(shù)據(jù)框是沒(méi)有相同的鍵,本身是無(wú)法連接的:
參數(shù)suffixes
如果連接之后結(jié)果有相同的字段出現(xiàn),默認(rèn)后綴是_x_、_y。這個(gè)參數(shù)就是改變我們默認(rèn)的后綴。我們回顧下笛卡爾積的形成;
現(xiàn)在我們可以指定想要的后綴:
indicator
這個(gè)參數(shù)的作用是表明生成的一條記錄是來(lái)自哪個(gè)DataFrame:both、left_only、right_only
如果帶上參數(shù)會(huì)顯示一個(gè)新字段_merge:
不帶上參數(shù)的話,默認(rèn)是不會(huì)顯示來(lái)源的,看默認(rèn)的情況:
總結(jié)
merge函數(shù)真的是非常強(qiáng)大,在工作中也使用地很頻繁,完全可以實(shí)現(xiàn)SQL中的join效果。希望本文的圖解能夠幫助讀者理解并掌握這個(gè)合并函數(shù)的使用。同時(shí)pandas還有另外幾個(gè)與合并相關(guān)的函數(shù),比如:join、concat、append,會(huì)在下一篇文中統(tǒng)一講解。
往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯黃海廣老師《機(jī)器學(xué)習(xí)課程》課件合集 本站qq群851320808,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【Python】挑战SQL:图解Pandas的数据合并merge的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用dos进入mysql数据库操作数据
- 下一篇: 特征对齐的旋转目标检测:Align De