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基礎(chǔ)】入門Pandas不可不知的技巧

        共 11695字,需瀏覽 24分鐘

         ·

        2021-05-05 12:18

        來(lái)源:Python數(shù)據(jù)之道

        作者:Peter

        整理:陽(yáng)哥

        如果你用 Python 做數(shù)據(jù)分析,必然會(huì)繞不過(guò) Pandas 的使用,實(shí)際上, Python 也是由于 numpy、pandas 等數(shù)據(jù)科學(xué)庫(kù)的出現(xiàn),才開(kāi)始在數(shù)據(jù)科學(xué)領(lǐng)域?qū)崿F(xiàn)了快速的發(fā)展,因此,學(xué)好 Pandas 有很重要的現(xiàn)實(shí)意義。

        「Python數(shù)據(jù)之道」 之前已經(jīng)分享過(guò)一些關(guān)于介紹 Pandas 的內(nèi)容,大家也可以前往閱讀:


        本文總結(jié)自己經(jīng)常使用的pandas操作方法:

        • 創(chuàng)建DataFrame數(shù)據(jù)
        • 查看數(shù)據(jù)相關(guān)信息
        • 查看頭尾文件
        • 花樣取數(shù)
        • 切片取數(shù)
        • 常見(jiàn)函數(shù)使用

        首先,導(dǎo)入包

        import pandas as pd
        import numpy as np

        01 創(chuàng)建DataFrame數(shù)據(jù)

        方式1:通過(guò)字典直接創(chuàng)建

        df1 = pd.DataFrame({
            "name":["小明","小紅","小孫","王小","關(guān)宇","劉蓓","張菲"],
            "age":[20,18,27,20,28,18,25],
            "sex":["男","女","男","男","男","女","女"],
            "score":[669,570,642,590,601,619,701],
            "address":["北京","深圳","廣州","武漢","深圳","廣州","長(zhǎng)沙"]
        })

        df1

        數(shù)據(jù)如下圖:

        方式2:通過(guò)本地?cái)?shù)據(jù)讀取

        從本地文件中讀取進(jìn)來(lái)。現(xiàn)在本地有一個(gè)文件:學(xué)生信息.xlsx直接通過(guò)pd.read_excel()讀進(jìn)來(lái):

        df2 = pd.read_excel("學(xué)生信息.xlsx")
        df2

        可以看到效果和上面是一樣的

        02 數(shù)據(jù)探索

        查看數(shù)據(jù)shape

        shape表示數(shù)據(jù)是由多少行和列組成:

        df1.shape  # (7,5)

        查看字段屬性名稱

        df1.columns

        查看屬性的數(shù)據(jù)類型

        df1.dtypes

        可以看到只有兩種數(shù)據(jù)類型:int64和object

        查看數(shù)據(jù)是否缺失

        df1.isnull()   # 如果缺失顯示為True,否則顯示False
        df1.isnull().sum() # 統(tǒng)計(jì)缺失值的個(gè)數(shù)。一個(gè)True計(jì)數(shù)一次

        結(jié)果顯示:本次數(shù)據(jù)是沒(méi)有缺失值的

        查看數(shù)據(jù)行索引

        df1.index

        查看數(shù)據(jù)描述信息

        df1.describe

        查看數(shù)據(jù)統(tǒng)計(jì)值

        統(tǒng)計(jì)值信息只會(huì)顯示類型為數(shù)值型的數(shù)據(jù)統(tǒng)計(jì)值信息:

        df1.describe()

        統(tǒng)計(jì)值的結(jié)果包含:個(gè)數(shù)count、均值mean、方差std、最值min\max、四分位數(shù)25%、中位數(shù)50%、四分之三分位數(shù)75%。

        03 查看頭尾文件

        通過(guò)head和tail方法能夠快速查看數(shù)據(jù)的頭尾文件。

        head

        df1.head()   # 默認(rèn)是查看前5行數(shù)據(jù)
        df1.head(3)  # 指定顯示的行數(shù)

        tail

        df1.tail()    # 默認(rèn)尾部5行
        df1.tail(3)   # 指定尾部3行數(shù)據(jù)

        04 花樣取數(shù)

        從pandas的DataFrame數(shù)據(jù)框中取出我們想要的數(shù)據(jù),然后進(jìn)行處理

        取出某個(gè)字段的數(shù)據(jù)

        我們?nèi)〕鰊ame這列的數(shù)據(jù):

        name = df1["name"]
        name

        # 結(jié)果
        0    小明
        1    小紅
        2    小孫
        3    王小
        4    關(guān)宇
        5    劉蓓
        6    張菲
        Name: name, dtype: object

        取出多個(gè)字段的數(shù)據(jù)

        比如我們?nèi)〕鰊ame和age列的數(shù)據(jù):

        name_age = df1[["name","age"]]  
        name_age

        # 結(jié)果
          name age
        0 小明 20
        1 小紅 18
        2 小孫 27
        3 王小 20
        4 關(guān)宇 28
        5 劉蓓 18
        6 張菲 25

        根據(jù)字段類型選擇數(shù)據(jù)

        比如,我們想選擇字段類型為int64的數(shù)據(jù),通過(guò)查看的字段數(shù)據(jù)類型顯示:age和score都是int64類型

        1、選擇單個(gè)數(shù)據(jù)類型

        # 1、選擇單個(gè)數(shù)據(jù)類型

        df1.select_dtypes(include='int64')

        # 結(jié)果
          age score
        0 20 669
        1 18 570
        2 27 642
        3 20 590
        4 28 601
        5 18 619
        6 25 701

        2、同時(shí)選擇多個(gè)類型

        df1.select_dtypes(include=['int64','object'])

        # 結(jié)果
          name  age sex score address
        0 小明  20  男 669    北京
        1 小紅  18  女 570    深圳
        2 小孫  27  男 642    廣州
        3 王小  20  男 590    武漢
        4 關(guān)宇  28  男 601    深圳
        5 劉蓓  18  女 619    廣州
        6 張菲  25  女 701    長(zhǎng)沙

        因?yàn)閿?shù)據(jù)中只有int64,object,所以我們?nèi)窟x出來(lái)了。

        3、選擇排除某些數(shù)據(jù)類型之外的數(shù)據(jù):

        # 選擇除了int64類型之外的數(shù)據(jù)
        # 排除name和score字段之外的數(shù)據(jù)
        df1.select_dtypes(exclude='int64'

        # 結(jié)果
          name sex address
        0 小明 男   北京
        1 小紅 女   深圳
        2 小孫 男   廣州
        3 王小 男   武漢
        4 關(guān)宇 男   深圳
        5 劉蓓 女   廣州
        6 張菲 女   長(zhǎng)沙

        根據(jù)數(shù)值大小取數(shù)

        1、直接通過(guò)判斷大小來(lái)取數(shù):

        df1[df1["age"] == 20]  # 年齡等于20
        df1[df1["age"] != 20]  # 年齡不等于20
        df1[df1["age"] >= 20]  # 年齡大于等于20

        2、多個(gè)判斷條件連用

        第一次使用上面的方法報(bào)錯(cuò):關(guān)鍵詞是ambiguous。判斷條件很讓pandas混淆,改成下面的寫法成功解決:

        df1[(df1["age"] >= 20) & (df1["age"] < 27)]

        根據(jù)字符串取數(shù)

        1、通過(guò)單個(gè)條件取數(shù)

        # 1、單條數(shù)據(jù)
        df1[df1["name"] == "小明"]  

        # 結(jié)果
          name  age sex  score address
        0 小明  20  男   669   北京

        2、通過(guò)多個(gè)條件取數(shù)

        選擇姓名是小明,或者年齡大于25的數(shù)據(jù)

        df1[(df1["name"] == "小明") | (df1["age"] > 25)]

        # 結(jié)果
          name  age sex  score address
        0 小明  20  男  669   北京
        2 小孫  27  男  642   廣州
        4 關(guān)宇  28  男  601   深圳

        3、字符串的開(kāi)始、結(jié)尾、包含函數(shù)

        • str.startswith(string)
        • str.endswith(string)
        • str.contains(string)
        # 1、取出以“小”開(kāi)頭的姓名
        df1[df1["name"].str.startswith("小")]  # name以"小"開(kāi)頭

        # 結(jié)果
         name  age sex  score address
        0 小明 20 男    669 北京
        1 小紅 18 女    570 深圳
        2 小孫 27 男    642 廣州
        # 以“關(guān)”開(kāi)始
        df1[df1["name"].str.startswith("關(guān)")]

        # 結(jié)果
         name  age sex  score address
        4 關(guān)宇 28 男    601 深圳
        # 3、以“菲”結(jié)尾
        df1[df1["name"].str.endswith("菲")]

        # 結(jié)果
          name  age sex  score address
        6 張菲  25  女   701   長(zhǎng)沙
        # 取出包含“小”的數(shù)據(jù):不管小是在開(kāi)頭,還是結(jié)尾都會(huì)被選出來(lái)
        df1[df1["name"].str.contains("小")]

        # 結(jié)果

          name  age sex  score address
        0 小明  20  男  669  北京
        1 小紅  18  女  570  深圳
        2 小孫  27  男  642  廣州
        3 王小  20  男  590  武漢

        上面的王小不是小開(kāi)頭,但是包含小,所以也被選出來(lái)。

        4、字符串取反操作

        取反符號(hào)是波浪線:~

        下面的例子是:取出名字name中不包含小的數(shù)據(jù),只有3個(gè)人名字中沒(méi)有小字。

        # 取出不包含小的數(shù)據(jù)
        df1[~df1["name"].str.contains("小")]

        # 結(jié)果
          name  age sex  score address
        4 關(guān)宇  28  男  601   深圳
        5 劉蓓  18  女  619   廣州
        6 張菲  25  女  701   長(zhǎng)沙

        05 切片取數(shù)

        切片是Python中存在的概念,在pandas中同樣可以使用。切片中存在3個(gè)概念:start、stop、step

        • start:起始索引,包含
        • stop:結(jié)束索引,不包含
        • step:步長(zhǎng),可正可負(fù);

        寫法為:[start:stop:step]

        步長(zhǎng)為正數(shù)

        1、通過(guò)下面的3個(gè)案例說(shuō)明:起始索引默認(rèn)從0開(kāi)始,步長(zhǎng)默認(rèn)是1

        2、指定起始索引,不指定結(jié)束索引,表示一直取到數(shù)據(jù)末尾

        df1[4:]  # 從索引4開(kāi)始取到末尾

        # 結(jié)果
          name  age sex  score address
        4 關(guān)宇  28  男  601   深圳
        5 劉蓓  18  女  619   廣州
        6 張菲  25  女  701   長(zhǎng)沙

        3、改變步長(zhǎng)的值

        df1[0:4:2]  # 改變步長(zhǎng):每隔2個(gè)值取一行數(shù)據(jù)

        # 結(jié)果
          name  age sex  score address
        0 小明  20  男   669   北京
        2 小孫  27  男   642   廣州

        上面的例子不指定起始索引:

        df1[:4:2]  # 默認(rèn)從0開(kāi)始

        4、只指定步長(zhǎng)

        df1[::2]   # 從頭到尾,步長(zhǎng)為2

        # 結(jié)果
          name  age sex  score address
        0 小明  20  男   669   北京
        2 小孫  27  男  642   廣州
        4 關(guān)宇  28  男  601   深圳
        6 張菲  25  女  701   長(zhǎng)沙

        步長(zhǎng)為負(fù)數(shù)

        1、步長(zhǎng)為-1,默認(rèn)是倒序輸出結(jié)果

        df1[::-1]  # 倒序輸出

        # 結(jié)果
           name  age sex  score address
        6  張菲   25 女    701  長(zhǎng)沙
        5  劉蓓   18 女    619  廣州
        4  關(guān)宇   28 男    601  深圳
        3  王小   20 男    590  武漢
        2  小孫   27 男    642  廣州
        1  小紅   18 女    570  深圳
        0  小明   20 男    669  北京

        2、步長(zhǎng)為負(fù),指定起始和終止索引,起始索引大于終止索引

        df1[4:0:-1]
          name  age sex  score address
        4 關(guān)宇  28  男   601   深圳
        3 王小  20  男   590   武漢
        2 小孫  27  男   642   廣州
        1 小紅  18  女   570   深圳

        3、起始和終止索引為負(fù)數(shù)

        df1[-1:-5:-1]  # 最后一行記錄索引為-1,不包含索引為-5的數(shù)據(jù)
         name  age sex  score address
        6 張菲 25 女    701  長(zhǎng)沙
        5 劉蓓 18 女    619  廣州
        4 關(guān)宇 28 男    601  深圳
        3 王小 20 男    590  武漢

        06 常用函數(shù)

        統(tǒng)計(jì)元素個(gè)數(shù)

        很多時(shí)候我們需要統(tǒng)計(jì)某個(gè)列中每個(gè)元素出現(xiàn)的個(gè)數(shù),相當(dāng)于是做詞頻統(tǒng)計(jì),使用:value_counts()方法,具體案例為:

        ??:新數(shù)據(jù)中df1增加了一列:班級(jí)class,后續(xù)有作用

        比如我們想統(tǒng)計(jì)每個(gè)城市出現(xiàn)了多少次:

        # 統(tǒng)計(jì)中每個(gè)城市各出現(xiàn)了多少次

        address = df1["address"].value_counts()
        address

        結(jié)果自動(dòng)是降序排列的Series類型數(shù)據(jù)

        索引重置

        索引重置使用reset_index()

        address_new = address.reset_index()
        address_new

        還比如我們想從數(shù)據(jù)中單獨(dú)取出sex="男"的數(shù)據(jù):

        fale = df1[df1["sex"] == "男"]
        fale

        我們觀察到數(shù)據(jù)前面的索引還是原來(lái)的,但是我們希望的是從0開(kāi)始顯示,比較符合我們的習(xí)慣:

        fale_1 = fale.reset_index()
        fale_1

        出現(xiàn)的結(jié)果中索引是我們想要的結(jié)果,但是出現(xiàn)了一列新的數(shù)據(jù),就是原來(lái)的索引構(gòu)成的數(shù)據(jù),這不是我們想要的數(shù)據(jù),需要去除:

        fale_1 = fale.reset_index(drop=True)  # 加上參數(shù)即可解決
        fale_1

        屬性重命名

        使用的是rename函數(shù),傳入columsn參數(shù):

        address_new = address_new.rename(columns={"index":"address",
                                                 "address":"number"
                                                })
        address_new

        groupby使用

        groupby主要是實(shí)現(xiàn)分組統(tǒng)計(jì)的功能:

        1、比如我們想統(tǒng)計(jì)男女各自的總分

        # 統(tǒng)計(jì)男女的總成績(jī):sum

        sex_score = df1.groupby("sex")["score"].sum()
        sex_score

        2、求男女各自的平均分mean

        # 統(tǒng)計(jì)男女的平均成績(jī):mean

        sex_score = df1.groupby("sex")["score"].mean()
        sex_score

        3、根據(jù)男女性別sex、班級(jí)class求總分

        # 先根據(jù)性別、班級(jí)求總分

        sex_class = df1.groupby(["sex","class"])["score"].sum()
        sex_class

        一行代碼實(shí)現(xiàn)上面的功能

        # 一行代碼實(shí)現(xiàn)

        df1.groupby(["sex","class"])["score"].sum().reset_index()

        apply函數(shù)

        還是上面的df1數(shù)據(jù)集:

        1、需求1:我們想將性別中的男變成1,女變成0

        # 1、改變:男-1,女-0

        df2 = df1.copy()  # 生成一個(gè)副本

        df2["sex"] = df2["sex"].apply(lambda x: 1 if x=="男" else 0)  # 通過(guò)匿名函數(shù)解決
        df2

        我們還可以自定義一個(gè)函數(shù)來(lái)實(shí)現(xiàn):

        #  自定義函數(shù)

        def apply_sex(x):
            return 1 if x == "男" else 0

        df3 = df1.copy()  # 生成一個(gè)副本df3

        df3["sex"] = df3["sex"].apply(apply_sex)  # 通過(guò)自定義函數(shù)解決
        df3

        2、還比如我們想給每個(gè)城市的后面加上一個(gè)“市”,變成北京市、深圳市等:

        # 2、給每個(gè)城市加上一個(gè)字:市,變成北京市、深圳市等

        df4 = df1.copy()

        df4["address"] = df4["address"].apply(lambda x: x + "市")
        df4

        總結(jié)

        本文中從pandas中DataFrame數(shù)據(jù)的創(chuàng)建,常見(jiàn)數(shù)據(jù)信息的探索,再到如何從數(shù)據(jù)框中獲取到我們指定的數(shù)據(jù),最后介紹了筆者常用的處理數(shù)據(jù)的方法,希望對(duì)入門或者對(duì)不熟悉pandas的朋友有所幫助。Pandas真的是十分強(qiáng)大,學(xué)好之后會(huì)大大節(jié)省我們處理數(shù)據(jù)的時(shí)間。

        作者簡(jiǎn)介

        Peter,碩士畢業(yè)僧一枚,從電子專業(yè)自學(xué)Python入門數(shù)據(jù)行業(yè),擅長(zhǎng)數(shù)據(jù)分析及可視化。喜歡數(shù)據(jù),堅(jiān)持跑步,熱愛(ài)閱讀,樂(lè)觀生活。個(gè)人格言:不浮于世,不負(fù)于己

        個(gè)人站點(diǎn):www.renpeter.cn

        往期精彩回顧





        本站qq群851320808,加入微信群請(qǐng)掃碼:

        瀏覽 61
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            国产日韩欧美视频在线 | 一女n男np高h巨h公交车视频 | 涩涩涩综合| jk自慰网站 | 免费无码视频一区 | 顶级嫩模被啪到呻吟不断红楼 | 午夜91视频| 亚洲AV无码久久寂寞少妇多毛 | 日本天堂网中文字幕 | 99re6这里有精品热视频 |