1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【Python】挑戰(zhàn)SQL:圖解Pandas的數(shù)據(jù)合并merge

        共 4243字,需瀏覽 9分鐘

         ·

        2021-08-20 08:26

        公眾號:尤而小屋
        作者:Peter
        編輯:Peter

        在實際的業(yè)務(wù)需求中,我們的數(shù)據(jù)可能存在于不同的庫表中。很多情況下,我們需要進(jìn)行多表的連接查詢來實現(xiàn)數(shù)據(jù)的提取,通過SQL的join,比如left join、left join、inner join等來實現(xiàn)。

        在pandas中也有實現(xiàn)合并功能的函數(shù),比如:concat、append、join、merge。本文中重點介紹的是merge函數(shù),也是pandas中最為重要的一個實現(xiàn)數(shù)據(jù)合并的函數(shù)。

        看完了你會放棄SQL嗎?

        Pandas連載文章

        目前Pandas系列文章已經(jīng)更新了13篇,文章都是以豐富案例+圖解的風(fēng)格,歡迎大家訪問閱讀。有很多個人推薦的文章:

        圖解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個數(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ù)索引來連接
                 right_index=False
                 sort=False# 是否排序
                 suffixes=('_x''_y'),   # 改變后綴
                 copy=True
                 indicator=False,   # 顯示字段來源
                 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)建兩個數(shù)據(jù)幀DataFrame的笛卡爾積,默認(rèn)保留左邊的順序

        • on:連接的列屬性;默認(rèn)是兩個DataFrame的相同字段

        • left_on/right_on:指定兩個不同的鍵進(jìn)行聯(lián)結(jié)

        • left_index、right_index:通過索引進(jìn)行合并

        • suffixes:指定我們自己想要的后綴

        • indictor:顯示字段的來源

        模擬數(shù)據(jù)

        我們創(chuàng)建了4個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就是需要連接的兩個數(shù)據(jù)幀,一般有兩種寫法:

        • pd.merge(left,right),個人習(xí)慣
        • left.merge(right)

        圖解過程如下:

        • 兩個數(shù)據(jù)框df1(left)、df2(right)有相同的字段userid
        • 默認(rèn)是通過相同的字段(鍵)進(jìn)行關(guān)聯(lián),取出鍵中相同的值(ac),而且每個鍵的記錄要全部顯示,比如a有多條記錄

        參數(shù)how

        inner

        inner稱之為內(nèi)連接。它會直接根據(jù)相同的列屬性userid進(jìn)行關(guān)聯(lián),取出屬性下面相同的數(shù)據(jù)信息a、c

        ??上面的圖解過程就是默認(rèn)的使用how="inner"

        outer

        outer稱之為外連接,在拼接的過程中會取兩個數(shù)據(jù)框中鍵的并集進(jìn)行拼接

        • 外連接,取出全部交集鍵的并集。例子中是user的并集
        • 如果某個鍵在某個數(shù)據(jù)框中不存在數(shù)據(jù),則為NaN

        圖解過程如下:

        • 也是根據(jù)相同的字段來進(jìn)行連結(jié):userid
        • 保留兩邊的全部數(shù)據(jù),所以abcde全部存在
        • 如果某邊不存在鍵下面的某個值,則結(jié)果中用NaN補(bǔ)充。比如df1的userid中存在b,但是df3中不存在,則結(jié)果b對應(yīng)的score為NaN,cd類似;e在df3中存在e的取值,但是df1中不存在,則age的值為NaN

        left

        以左邊數(shù)據(jù)框中的鍵為基準(zhǔn);如果左邊存在但是右邊不存在,則右邊用NaN表示

        圖解過程如下:

        • 和上面圖解過程的結(jié)果差別在于,沒有出現(xiàn)e;
        • 當(dāng)how="left",只會保留df1(left)中userid下面的全部取值,不包含e

        right

        以右邊數(shù)據(jù)框中的鍵的取值為基準(zhǔn);如果右邊存在但是左邊不存在,則左邊用NaN表示

        image-20210724095138183

        圖解過程如下:

        • 當(dāng)how="right",只會保留df3(right)中userid的全部取值
        • 結(jié)果只保留了df3的userid下面的全部取值:a、e

        cross

        笛卡爾積:兩個數(shù)據(jù)框中的數(shù)據(jù)交叉匹配,出現(xiàn)n1*n2的數(shù)據(jù)量

        笛卡爾積的圖解過程如下:

        • 出現(xiàn)的數(shù)據(jù)量是4*2,userid下面的數(shù)據(jù)交叉匹配
        • 在最終結(jié)果中相同的字段userid為了避免混淆,會帶上默認(rèn)的后綴_x、_y

        參數(shù)on

        如果待連接的兩個數(shù)據(jù)框有相同的鍵,則默認(rèn)使用該相同的鍵進(jìn)行聯(lián)結(jié)。

        上面的所有圖解例子的參數(shù)on默認(rèn)都是使用相同的鍵進(jìn)行聯(lián)結(jié),所以有時候可省略。

        再看個例子:

        還可以將left和right的位置進(jìn)行互換:

        上面的兩個例子都是針對數(shù)據(jù)框只有具有相同的一個鍵,如果不止通過一個鍵進(jìn)行聯(lián)結(jié),該如何處理?通過一個來自官網(wǎng)的例子來解釋,我們先創(chuàng)建兩個DataFrame:df5、df6

        現(xiàn)在進(jìn)行兩個數(shù)據(jù)框的合并:

        合并的圖解過程如下:

        • 通過on參數(shù)指定兩個連接的字段key1、key2
        • 只有當(dāng)兩個數(shù)據(jù)框中的key1和key2的取值完全相同的時候(交集),才會保留下來;比如都出現(xiàn)了key1=K0,key2=K0和key1=K1,key2=K0。

        在看一個通過how="outer"進(jìn)行連接的案例:

        看看圖解的過程:

        • 指定連接的兩個鍵key1、key2
        • 使用how="outer",會保留兩個數(shù)據(jù)框中的全部數(shù)據(jù)。某個數(shù)據(jù)框中不存在鍵的值,則取NaN

        參數(shù)left_on、right_on

        上面在連接合并的時候,兩個數(shù)據(jù)框之前都是有相同的字段,比如userid或者key1和key2。但是如何兩個數(shù)據(jù)框中沒有相同的鍵,但是這些鍵中的取值有相同的部分,比如我們的df1、df3:

        在這個時候我們就使用left_on和right_on參數(shù),分別指定兩邊連接的鍵:

        如果我們不指定,系統(tǒng)就會報錯,因為這兩個數(shù)據(jù)框是沒有相同的鍵,本身是無法連接的:

        參數(shù)suffixes

        如果連接之后結(jié)果有相同的字段出現(xiàn),默認(rèn)后綴是_x_、_y。這個參數(shù)就是改變我們默認(rèn)的后綴。我們回顧下笛卡爾積的形成;

        現(xiàn)在我們可以指定想要的后綴:

        indicator

        這個參數(shù)的作用是表明生成的一條記錄是來自哪個DataFrame:both、left_only、right_only

        如果帶上參數(shù)會顯示一個新字段_merge

        不帶上參數(shù)的話,默認(rèn)是不會顯示來源的,看默認(rèn)的情況:

        總結(jié)

        merge函數(shù)真的是非常強(qiáng)大,在工作中也使用地很頻繁,完全可以實現(xiàn)SQL中的join效果。希望本文的圖解能夠幫助讀者理解并掌握這個合并函數(shù)的使用。同時pandas還有另外幾個與合并相關(guān)的函數(shù),比如:join、concat、append,會在下一篇文中統(tǒng)一講解。

        往期精彩回顧




        本站qq群851320808,加入微信群請掃碼:
        瀏覽 40
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            影音先锋资源共享 | 操逼小视频免费看 | 欧美性大战久久久久 | 欧美男男激情视频 | 久久久久国产精品老熟 | 一道本无码高清 | 国产男女爽爽爽免费视频 | 操逼逼视频免费看 | 亚洲黄色视频网站在线观看 | 超碰伊人网|