图解pandas的数据合并merge
公眾號:尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
在實際的業務需求中,我們的數據可能存在于不同的庫表中。很多情況下,我們需要進行多表的連接查詢來實現數據的提取,通過SQL的join,比如left join、left join、inner join等來實現。
在pandas中也有實現合并功能的函數,比如:concat、append、join、merge。本文中重點介紹的是merge函數,也是pandas中最為重要的一個實現數據合并的函數。
看完了你會放棄SQL嗎?
Pandas連載文章
目前Pandas系列文章已經更新了13篇,文章都是以案例+圖解的風格,歡迎訪問閱讀。有很多個人推薦的文章:
參數
官網學習地址: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表示
圖解過程如下:
- 當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,會在下一篇文中統一講解。
總結
以上是生活随笔為你收集整理的图解pandas的数据合并merge的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 斜坡响应,二阶系统的斜坡响
- 下一篇: 会声会影2020软件新增功能详情