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數(shù)據(jù)分析,你不能不知道的技能

        共 10692字,需瀏覽 22分鐘

         ·

        2021-08-27 14:02

        ↑↑↑關(guān)注后"星標(biāo)"簡說Python

        人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析
         簡說Python推薦 

        來源:簡說Python 編輯:老表

        作者:修羅閃空、pluto、喬瞧、石墨錫 

        • 一、前言

        • 二、本文概要

        • 三、pandas merge by 修羅閃空

          • 3.1 merge函數(shù)用途

          • 3.2 merge函數(shù)的具體參數(shù)

          • 3.3 merge函數(shù)的應(yīng)用

        • 四、pandas apply by pluto、喬瞧

          • 4.1 pandas apply by pluto

          • 4.2 pandas apply by 喬瞧

        • pandas pivot_table by 石墨錫


        一、前言

        本文來自四位讀者的合作,這四位讀者是之前推文14個(gè)pandas神操作,手把手教你寫代碼中贈書活動的中獎?wù)?,獎品是贈書《深入淺出Pandas:利用Python進(jìn)行數(shù)據(jù)處理與分析》。

        這里贈書有要求:獲贈讀者需要先說一下自己對對應(yīng)最愛pandas操作函數(shù)的理解+一個(gè)對應(yīng)函數(shù)應(yīng)用小案例,于是也就有了今天這篇文章。

        后面贈書也會更多這樣,一來確保圖書贈送出去是給到了確實(shí)有需要、是想學(xué)習(xí)的讀者,再者獲贈讀者的分享也可以給其他未獲得贈書的讀者學(xué)習(xí),也可以給公眾號推文積累素材。

        廢話不多說,開始今天的學(xué)習(xí)吧,三個(gè)pandas中經(jīng)典中經(jīng)典的函數(shù)使用分享,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)本文,支持作者,公眾號簡說Python技術(shù)文章,只要點(diǎn)贊破百,老表就會在視頻號開直播帶帶大家一起進(jìn)行項(xiàng)目復(fù)現(xiàn)。

        二、本文概要

        • pandas merge by 修羅閃空
        • pandas apply by pluto、喬瞧
        • pandas pivot_table by 石墨錫

        三、pandas merge by 修羅閃空

        3.1 merge函數(shù)用途

        pandas中的merge()函數(shù)類似于SQL中join的用法,可以將不同數(shù)據(jù)集依照某些字段(屬性)進(jìn)行合并操作,得到一個(gè)新的數(shù)據(jù)集。

        3.2 merge函數(shù)的具體參數(shù)

        • 用法:
        DataFrame1.merge(DataFrame2, 
        how=‘inner’, on=None, left_on=None
        right_on=None, left_index=False
        right_index=False, sort=False, suffixes=(‘_x’, ‘_y’))
        • 參數(shù)說明:

          • how:默認(rèn)為inner,可設(shè)為inner/outer/left/right;

          • on:根據(jù)某個(gè)字段進(jìn)行連接,必須存在于兩個(gè)DateFrame中(若未同時(shí)存在,則需要分別使用left_on和right_on來設(shè)置);

          • left_on:左連接,以DataFrame1中用作連接鍵的列;

          • right_on:右連接,以DataFrame2中用作連接鍵的列;

          • left_index:將DataFrame1行索引用作連接鍵;

          • right_index:將DataFrame2行索引用作連接鍵;

          • sort:根據(jù)連接鍵對合并后的數(shù)據(jù)進(jìn)行排列,默認(rèn)為True;

          • suffixes:對兩個(gè)數(shù)據(jù)集中出現(xiàn)的重復(fù)列,新數(shù)據(jù)集中加上后綴_x,_y進(jìn)行區(qū)別。

        3.3 merge函數(shù)的應(yīng)用

        3.3.1 merge一般應(yīng)用

        import pandas as pd

        # 定義資料集并打印出來
        left = pd.DataFrame({'key1': ['K0''K0''K1''K2'],
                             'key2': ['K0''K1''K0''K1'],
                             'A': ['A0''A1''A2''A3'],
                             'B': ['B0''B1''B2''B3']})
        right = pd.DataFrame({'key1': ['K0''K1''K1''K2'],
                              'key2': ['K0''K0''K0''K0'],
                              'C': ['C0''C1''C2''C3'],
                              'D': ['D0''D1''D2''D3']})

        print(left)
        print('------------')
        print(right)
        • 單個(gè)字段連接
        # 依據(jù)key1 column合并,并打印
        res = pd.merge(left, right, on='key1')
        print(res)
        • 多字段連接
        # 依據(jù)key1和key2 column進(jìn)行合并,并打印出四種結(jié)果['left', 'right','outer', 'inner']
        res = pd.merge(left, right, on=['key1''key2'], how='inner')
        print(res)

        res = pd.merge(left, right, on=['key1''key2'], how='outer')
        print(res)

        res = pd.merge(left, right, on=['key1''key2'], how='left'# 以left為主進(jìn)行合并
        print(res)

        res = pd.merge(left, right, on=['key1''key2'], how='right'# 以right為主進(jìn)行合并
        print(res)

        3.3.2 merge進(jìn)階應(yīng)用

        • indicator 設(shè)置合并列數(shù)據(jù)來源
        # indicator 設(shè)置合并列數(shù)據(jù)來源
        df1 = pd.DataFrame({'coll': [01], 'col_left': ['a''b']})
        df2 = pd.DataFrame({'coll': [122], 'col_right': [222]})
        print(df1)
        print('---------')
        print(df2)

        # 依據(jù)coll進(jìn)行合并,并啟用indicator=True,最后打印
        res = pd.merge(df1, df2, on='coll', how='outer', indicator=True)
        print(res)
        '''
        left_only 表示數(shù)據(jù)來自左表
        right_only 表示數(shù)據(jù)來自右表
        both 表示兩個(gè)表中都有,也就是匹配上的
        '''

        # 自定義indicator column的名稱并打印出
        res = pd.merge(df1, df2, on='coll', how='outer', indicator='indicator_column')
        print(res)
        • 依據(jù)index合并
        # 依據(jù)index合并
        # 定義數(shù)據(jù)集并打印出
        left = pd.DataFrame({'A': ['A0''A1''A2'],
                             'B': ['B0''B1''B2']},
                           index = ['K0''K1''K2'])
        right = pd.DataFrame({'C': ['C0''C2''C3'],
                             'D': ['D0''D2''D3']},
                           index = ['K0''K2''K3'])
        print(left)
        print('---------')
        print(right)
        # 依據(jù)左右數(shù)據(jù)集的index進(jìn)行合并,how='outer',并打印
        res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
        print(res)

        # 依據(jù)左右數(shù)據(jù)集的index進(jìn)行合并,how='inner',并打印
        res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
        print(res)
        • 解決overlapping的問題
        # 解決overlapping的問題
        # 定義資料集
        boys = pd.DataFrame({'k': ['K0''K1''K2'], 'age': [123]})
        girls = pd.DataFrame({'k': ['K0''K1''K3'], 'age': [456]})
        print(boys)
        print('---------')
        print(girls)

        # 使用suffixes解決overlapping的問題
        # 比如將上面兩個(gè)合并時(shí),age重復(fù)了,則可通過suffixes設(shè)置,以此保證不重復(fù),不同名(默認(rèn)會在重名列名后加_x _y)
        res = pd.merge(boys, girls, on='k', suffixes=['_boy''_girl'], how='inner')
        print(res)

        四、pandas apply by pluto、喬瞧

        4.1 pandas apply by pluto

        apply函數(shù)是pandas中極其好用的一個(gè)函數(shù),它可以對dataframe在行或列方向上進(jìn)行批量化處理,從而大大簡化數(shù)據(jù)處理的過程。

        apply函數(shù)的基本形式:

        DataFrame.apply(func, 
        axis=0, broadcast=False
        raw=False, reduce=None, args=(), **kwds)

        我們最常用前兩個(gè)參數(shù),分別是func運(yùn)算函數(shù)和axis運(yùn)算的軸,運(yùn)算軸默認(rèn)是axis=0,按列作為序列傳入func運(yùn)算函數(shù),設(shè)置axis=1則表示按行進(jìn)行計(jì)算。

        在運(yùn)算函數(shù)并不復(fù)雜的情況下,第一個(gè)參數(shù)通常使用lambda函數(shù)。當(dāng)函數(shù)復(fù)雜時(shí)可以另外寫一個(gè)函數(shù)來調(diào)用。下面通過一個(gè)實(shí)例來說明:

        import pandas as pd

        df = pd.DataFrame({'A':[3,1,4,1,5,9,None,6],
                      'B':[1,2,3,None,5,6,7,8]})

        d = df.apply(lambda x: x.fillna(x.mean()))
        print(df)
        print('----------')
        print(d)

        處理前的數(shù)據(jù):處理后的數(shù)據(jù):

        可以看到上面代碼通過apply對nan值進(jìn)行了均值填充,填充的為nan值所在列的均值。

        在默認(rèn)情況下,axis參數(shù)值為0,表示在行方向上進(jìn)行特定的函數(shù)運(yùn)算,即對每一列進(jìn)行運(yùn)算。

        我們可以設(shè)置axis=1來對每一行進(jìn)行運(yùn)算。例如我將上例設(shè)置為axis=1,結(jié)果變?yōu)椋?img data-ratio="0.9477351916376306" src="https://filescdn.proginn.com/39af2f410d6e9b649723c671a257a0ab/ca98b0217cc5f14d05dfd60b91b47145.webp" data-type="png" data-w="574" style="display: block;margin-right: auto;margin-left: auto;">

        可以看出它是使用每行的均值對nan值進(jìn)行了填充。

        apply也可以另寫函數(shù)來調(diào)用:

        import pandas as pd

        df = pd.DataFrame({'A':[3,1,4,1,5,9,None,6],
                      'B':[1,2,3,None,5,6,7,8]})

        def add(x):
            return x+1

        d = df.apply(add, axis=1)
        print(df)
        print('----------')
        print(d)

        這個(gè)函數(shù)實(shí)現(xiàn)了對每一列上的數(shù)字加一:

        注意:行方向,不是指對行進(jìn)行運(yùn)算。

        比如:一行有[a, b, c, d],行方向運(yùn)算指的是按先計(jì)算a列,然后計(jì)算b列,再計(jì)算c列,最后計(jì)算d列,所以行方向指的只是運(yùn)算順序的方向。

        (不用過度糾結(jié),記住axis=0是對列進(jìn)行計(jì)算,axis=1是對行進(jìn)行計(jì)算即可)

        4.2 pandas apply by 喬瞧

        首先還是要感謝【老表Max】推送的視頻及文檔,都比較精華,為初學(xué)者指明了方向。

        今天是學(xué)習(xí)pandas的第四天,最深感觸是其在處理EXCEL數(shù)據(jù)方面可為鬼斧神工,無論增、刪、查、分都高效快捷,本以為Pandas做到這種程度已經(jīng)相當(dāng)棒了,但是當(dāng)學(xué)到apply函數(shù)時(shí),才發(fā)覺它超出了自己的想象力。

        Apply簡單案例如下:

        唐僧師徒加上白龍馬一行五人去參加成人考試,考試科目包含語文、數(shù)學(xué)、英語共三門,現(xiàn)在想要知道三門科目成績均不小于85分的人有哪些?

        import pandas as pd
        df = pd.DataFrame({'語文':[93,80,85,76,58],
                           '數(shù)學(xué)':[87,99,95,85,70],
                           '英語':[80,85,97,65,88]}, 
                          index=['孫悟空','豬八戒','沙和尚','唐僧','白龍馬']
                         )
        print(df)
        print('-----------')
        df1 = df.loc[df['語文'].apply(lambda x:85<=x<100)] \
            .loc[df['英語'].apply(lambda x:85<=x<100)] \
            .loc[df['數(shù)學(xué)'].apply(lambda x:85<=x<100)]
        print(df1)

        pandas pivot_table by 石墨錫

        在pandas中 除了pivot_table  還有pivot函數(shù)也一樣可以實(shí)現(xiàn)數(shù)據(jù)透視功能,前者可以看成后者的增強(qiáng)版。

        pivot_table函數(shù)的基本形式:

        DataFrame.pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)

        pivot_tabel對數(shù)據(jù)格式要求不高,而且支持aggfunc/fillvalue等參數(shù),所以應(yīng)用更加廣泛。

        pivot_table函數(shù)的參數(shù)有values(單元格值)、index(索引)、columns(列名),這些參數(shù)組成一個(gè)數(shù)據(jù)透視表的基本結(jié)構(gòu)。

        復(fù)雜一點(diǎn) 要用到aggfunc方法,默認(rèn)是求均值(針對于數(shù)值列),當(dāng)然也可以求其他統(tǒng)計(jì)量或者得到數(shù)據(jù)類型的轉(zhuǎn)換,而且可以多個(gè)統(tǒng)計(jì)方法同時(shí)使用。

        總而言之,pivot_table可以轉(zhuǎn)換各個(gè)維度去觀察數(shù)據(jù),達(dá)到“透視”的目的。

        案例說明:

        import numpy as np
        import pandas as pd
        df = pd.DataFrame({'brand': ['蘋果''三星''華為''OPPO''諾基亞''小米'],
                            'country': ['美國','韓國','中國','中國','美國','中國'],
                           'system': ['OS''Android''Harmony''Android''Android''Android'],
                           'score': [94.7,  92.896.889.388.491.2]})
        df
        # 按country進(jìn)行分組,默認(rèn)計(jì)算數(shù)值列的均值
        df.pivot_table(index='country')
        # 按country進(jìn)行分組,除了計(jì)算score均值,另外計(jì)算每個(gè)國家出現(xiàn)的品牌個(gè)數(shù)(不重復(fù))
        df.pivot_table(index='country',aggfunc={'score':np.mean,'brand':lambda x : len(x.unique())})
        # 按country進(jìn)行分組,system作為列名,score作為表中的值(重復(fù)的取均值),取對應(yīng)的數(shù)據(jù)生成新的表
        df.pivot_table(index='country',columns='system',values='score')
        # 統(tǒng)計(jì)各個(gè)國家手機(jī)的最高分 最低分  平均分,空值填充為零
        df.pivot_table(index='country',columns='system',values='score',aggfunc=[max,min,np.mean],fill_value=0)

        最后,再次給大家安利下《深入淺出Pandas:利用Python進(jìn)行數(shù)據(jù)處理與分析》,將pandas相關(guān)知識講的特別齊全、詳細(xì),最后一章節(jié)還要大量的實(shí)踐項(xiàng)目和案例,我在編輯本文時(shí),對于讀者分享內(nèi)容中不確定的部分,也有查看圖書說明,深感這本圖書對于pandas使用者的好處。

        今天就到這里啦,歡迎大家在評論區(qū)留言說說你學(xué)習(xí)本文的感受或者你想推薦的其他pandas使用技巧,優(yōu)秀分享將有可能獲得贈書或者紅包獎勵哦~

        --END--


        本文所有源碼,都已在Jupyter Notebook中調(diào)試通過(Python3.7+),需要源碼的,可以掃下方二維碼,添加老表微信獲取,回復(fù):pandas數(shù)據(jù)分析 即可。


        掃碼即可加我微信

        老表朋友圈經(jīng)常有贈書/紅包福利活動

        新玩法,以后每篇技術(shù)文章,點(diǎn)贊超過100+,我將在個(gè)人視頻號直播帶大家一起進(jìn)行項(xiàng)目實(shí)戰(zhàn)復(fù)現(xiàn),快嘎嘎點(diǎn)贊吧?。。?/span>

        直播將在我的視頻號:老表Max 中開展,掃上方二維碼添加我微信即可查看我的視頻號。


        大家的 點(diǎn)贊、留言、轉(zhuǎn)發(fā)是對號主的最大支持。



        學(xué)習(xí)更多:
        整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了

        點(diǎn)贊”就是對博主最大的支持 

        瀏覽 42
        點(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>
            韩国精品一区二区三区无码视频 | 女王sm榨精免费一区二区 | 国产精品一哟哟哟 | 欧美做爰免费完整版 | 国产乱伦免费观看 | 少妇酒店露脸3p 少妇的诱惑播放 | 欧美性爱视频一区二区三区 | 高潮在线视频 | 《抗日性艳史电影》 | 校花被操在线观看 |