<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4243字,需瀏覽 9分鐘

           ·

          2021-08-20 08:26

          公眾號(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ù)幀,一般有兩種寫法:

          • 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)一講解。

          往期精彩回顧




          本站qq群851320808,加入微信群請(qǐng)掃碼:
          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品久久久久久久久久青青 | 亚洲欧洲精品成人久久奇米网 | 三级无码在线观看视频 | 欧美九九九九 | 中文字幕aaa |