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>

        Pandas的merge操作,像數(shù)據(jù)庫一樣盡情join

        共 1811字,需瀏覽 4分鐘

         ·

        2020-08-17 00:07

        今天是我們一起來聊聊dataframe的合并。


        常見的數(shù)據(jù)合并操作主要有兩種,第一種是我們新生成了新的特征,想要把它和舊的特征合并在一起。第二種是我們新獲取了一份數(shù)據(jù)集,想要擴(kuò)充舊的數(shù)據(jù)集。這兩種合并操作在我們?nèi)粘5墓ぷ鳟?dāng)中非常尋常,那么究竟應(yīng)該怎么操作呢?讓我們一個一個來看。

        merge

        首先我們來看dataframe當(dāng)中的merge操作,merge操作類似于數(shù)據(jù)庫當(dāng)中兩張表的join,可以通過一個或者多個key將多個dataframe鏈接起來。

        我們首先來創(chuàng)建兩個dataframe數(shù)據(jù):

        df1?=?pd.DataFrame({'id':?[1,?2,?3,?3,?5,?7,?6],?'age':?range(7)})

        df2?=?pd.DataFrame({'id':?[1,?2,?4,?4,?5,?6,?7],?'score':?range(7)})

        我們可以看到這兩個dataframe當(dāng)中都有id這個字段,如果我們想要將它們根據(jù)id關(guān)聯(lián)起來,我們可以用pd.merge函數(shù)完成:

        這里雖然我們沒有指定根據(jù)哪一列完成關(guān)聯(lián),但是pandas會自動尋找兩個dataframe的名稱相同列來進(jìn)行關(guān)聯(lián)。一般情況下我們不這么干,還是推薦大家指定列名。指定列名很簡單,我們只需要傳入on這個參數(shù)即可。


        如果需要根據(jù)多列關(guān)聯(lián),我們也可以傳入一個數(shù)組。但假如兩個dataframe當(dāng)中的列名不一致怎么辦,比如這兩個dataframe當(dāng)中的一列叫做id,一列叫做number,該怎么完成join呢?

        df1?=?pd.DataFrame({'id':?[1,?2,?3,?3,?5,?7,?6],?'age':?range(7)})

        df2?=?pd.DataFrame({'number':?[1,?2,?4,?4,?5,?6,?7],?'score':?range(7)})


        這個時(shí)候就需要用left_on指定左表用來join的列名,用right_on指定右表用來join的列名。

        談到j(luò)oin,不得不提另外一個問題就是join的方式。我們都知道在數(shù)據(jù)庫的表join操作當(dāng)中我們通常的join方式有4種。分別是innner join,left join,right join和outer join。我們觀察一下上面的結(jié)果會發(fā)現(xiàn)關(guān)聯(lián)之后的數(shù)據(jù)條數(shù)變少了,這是因?yàn)槟J(rèn)的方式是inner join,也就是兩張表當(dāng)中都存在的數(shù)據(jù)才會被保留。如果是left join,那邊左邊當(dāng)中所有的數(shù)據(jù)都會保留,關(guān)聯(lián)不上的列置為None,同理,如果是right join,則右表全部保留,outer join則會全部保留。


        join的方式選擇通過how這個參數(shù)控制,比如如果我們想要左表保留,我們傳入how='left'即可。


        除此之外,merge操作還有一些其他的參數(shù),由于篇幅限制我們不一一介紹了,大家感興趣可以去查閱相關(guān)文檔。

        數(shù)據(jù)合并


        另外一個常用的操作叫做數(shù)據(jù)合并,為了和merge操作區(qū)分,我用了中文。雖然同樣是合并,但是它的邏輯和merge是不同的。對于merge來說,我們需要關(guān)聯(lián)的key,是通過數(shù)據(jù)關(guān)聯(lián)上之后再合并的。而合并操作是直接的合并,行對行合并或者是列對列合并,是忽視數(shù)據(jù)的合并。

        這個合并操作我們之前在numpy的介紹當(dāng)中曾經(jīng)也提到過,我們這里簡單回顧一下。

        首先我們先創(chuàng)建一個numpy的數(shù)組:

        import?numpy?as?np
        arr?=?np.random.rand(3,?4)


        之后呢,我們可以用concatenate函數(shù)把這個數(shù)組橫著拼或者是豎著拼,默認(rèn)是豎著拼:

        我們也可以通過axis這個參數(shù)讓它變成橫著拼:

        對于dataframe同樣也有這樣的操作,不過換了一個名字叫做concat。如果我們不指定的話會豎著拼接:

        豎著拼接的時(shí)候會按照列進(jìn)行對齊,如果列名對不上就會填充NaN。

        通過axis參數(shù)我們可以讓它橫向拼接:


        以上就是concat的基本用法了,除了基本用法之外,concat還有一些其他的應(yīng)用,比如說處理index層次索引等等。只是這些用法相對來說比較小眾,使用頻率不高,就不贅述了。





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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        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>
            天堂毛片| 国产伦精品246区妓女 | 天天综合网7799精品视频 | 国产高清一区二区 | 国产精品成人无码a v | 性视频网| 九色 青娱乐 | 操比免费看 | 欧美日韩在线观看视频网站 | 韩国三级国产 |