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