<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>

          一文輕松看懂Pandas中的merge!

          共 2574字,需瀏覽 6分鐘

           ·

          2021-01-27 12:58

          大家好,我是早起。

          Pandas中有很多好用的函數(shù),其中就包括merge,但是如果你剛接觸可能會被各種連接繞暈,本文嘗試講清楚!

          為了方便維護(hù),一般公司的數(shù)據(jù)在數(shù)據(jù)庫內(nèi)都是分表存儲的,比如用一個表存儲所有用戶的基本信息,一個表存儲用戶的消費(fèi)情況。所以,在日常的數(shù)據(jù)處理中,經(jīng)常需要將兩張表拼接起來使用,這樣的操作對應(yīng)到SQL中是join,在Pandas中則是用merge來實(shí)現(xiàn)。這篇文章就講一下merge的主要原理。

          上面的引入部分說到merge是用來拼接兩張表的,那么拼接時自然就需要將用戶信息一一對應(yīng)地進(jìn)行拼接,所以進(jìn)行拼接的兩張表需要有一個共同的識別用戶的鍵(key)。總結(jié)來說,整個merge的過程就是將信息一一對應(yīng)匹配的過程,下面介紹merge的四種類型,分別為'inner'、'left'、'right''outer'。

          inner

          merge'inner'的類型稱為內(nèi)連接,它在拼接的過程中會取兩張表的鍵(key)的交集進(jìn)行拼接。什么意思呢?下面以圖解的方式來一步一步拆解。

          首先我們有以下的數(shù)據(jù),左側(cè)和右側(cè)的數(shù)據(jù)分別代表了用戶的基礎(chǔ)信息消費(fèi)信息,連接兩張表的鍵是userid

          現(xiàn)在用'inner'的方式進(jìn)行merge

          In [6]: df_1.merge(df_2,how='inner',on='userid')Out[6]:  userid  age  payment0      a   23     20001      c   32     3500

          過程圖解:

          ①取兩張表的鍵的交集,這里df_1df_2userid的交集是{a,c}


          ②對應(yīng)匹配


          ③結(jié)果


          過程匯總:


          相信整個過程并不難理解,上面演示的是同一個鍵下,兩個表對應(yīng)只有一條數(shù)據(jù)的情況(一個用戶對應(yīng)一條消費(fèi)記錄),那么,如果一個用戶對應(yīng)了多條消費(fèi)記錄的話,那又是怎么拼接的呢?

          假設(shè)現(xiàn)在的數(shù)據(jù)變成了下面這個樣子,在df_2中,有兩條和a對應(yīng)的數(shù)據(jù):


          同樣用inner的方式進(jìn)行merge

          In [12]: df_1.merge(df_2,how='inner',on='userid')Out[12]:  userid  age  payment0      a   23     20001      a   23      5002      b   46     10003      c   32     3500

          整個過程除了對應(yīng)匹配階段,其他和上面基本都是一致的。

          過程圖解:

          ①取兩張表的鍵的交集,這里df_1df_2userid的交集是{a,b,c}


          ②對應(yīng)匹配時,由于這里的a有兩條對應(yīng)的消費(fèi)記錄,故在拼接時,會將用戶基礎(chǔ)信息表中a對應(yīng)的數(shù)據(jù)復(fù)制多一行來和右邊進(jìn)行匹配。


          ③結(jié)果


          left 和right

          'left''right'merge方式其實(shí)是類似的,分別被稱為左連接右連接。這兩種方法是可以互相轉(zhuǎn)換的,所以在這里放在一起介紹。

          • 'left'

          merge時,以左邊表格的鍵為基準(zhǔn)進(jìn)行配對,如果左邊表格中的鍵在右邊不存在,則用缺失值NaN填充。

          • 'right'

          merge時,以右邊表格的鍵為基準(zhǔn)進(jìn)行配對,如果右邊表格中的鍵在左邊不存在,則用缺失值NaN填充。

          什么意思呢?用一個例子來具體解釋一下,這是演示的數(shù)據(jù)


          現(xiàn)在用'left'的方式進(jìn)行merge

          In [21]: df_1.merge(df_2,how='left',on='userid')Out[21]:  userid  age  payment0      a   23   2000.01      b   46      NaN2      c   32   3500.03      d   19      NaN

          過程圖解:

          ①以左邊表格的所有鍵為基準(zhǔn)進(jìn)行配對。圖中,因?yàn)橛冶碇械?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">e不在左表中,故不會進(jìn)行配對。


          ②若右表中的payment列合并到左表中,對于沒有匹配值的用缺失值NaN填充


          過程匯總:


          對于'right'類型的merge'left'其實(shí)是差不多的,只要把兩個表格的位置調(diào)換一下,兩種方式返回的結(jié)果就是一樣的(),如下:

          In [22]: df_2.merge(df_1,how='right',on='userid')Out[22]:  userid  payment  age0      a   2000.0   231      c   3500.0   322      b      NaN   463      d      NaN   19

          至于'left''right'中(乃至于下面將介紹的'outer')連接的鍵是一對多的情況,原理和上方的'inner'是類似的,這里便不再贅述。

          outer

          'outer'外連接,在拼接的過程中它會取兩張表的鍵(key)的并集進(jìn)行拼接??次淖植粔蛑庇^,還是上例子吧!

          還是使用上方用過的演示數(shù)據(jù)


          這次使用'outer'進(jìn)行merge

          In [24]: df_1.merge(df_2,how='outer',on='userid')Out[24]:  userid   age  payment0      a  23.0   2000.01      b  46.0      NaN2      c  32.0   3500.03      d  19.0      NaN4      e   NaN    600.0

          圖解如下:

          ①取兩張表鍵的并集,這里是{a,b,c,d,e}


          ②將兩張表的數(shù)據(jù)列拼起來,對于沒有匹配到的地方,使用缺失值NaN進(jìn)行填充


          能讀到這里的小伙伴想必也基本理解了merge的整個過程,總結(jié)來說,merge的不同類型區(qū)別就在于,拼接時選用的兩張表格的鍵的集合不同。關(guān)于Pandas的merge就介紹到這里!


          -END-




          掃碼添加早小起

          1.?回復(fù)「進(jìn)群」進(jìn)入Python技術(shù)交流群

          2. 回復(fù)「Python」獲得Python技術(shù)圖書

          3. 回復(fù)「習(xí)題」領(lǐng)取Python數(shù)據(jù)處理200題




          瀏覽 31
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  午夜福利影视 | 白丝影院 | 精品秘 一区二三区免费 | 久久婷婷婬片A片AAA | www毛片 |