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ù)處理三板斧,你會幾板?

        共 3522字,需瀏覽 8分鐘

         ·

        2020-01-20 23:30



        bb107a5006eff96ffe290f92f89ba660.webp


        ? ? ?作者:易執(zhí)


        ? ? ?來源:Python讀數(shù)

        在日常的數(shù)據(jù)處理中,經(jīng)常會對一個DataFrame進行逐行、逐列和逐元素的操作,對應(yīng)這些操作,Pandas中的mapapplyapplymap可以解決絕大部分這樣的數(shù)據(jù)處理需求。這篇文章就以案例附帶圖解的方式,為大家詳細介紹一下這三個方法的實現(xiàn)原理,相信讀完本文后,不論是小白還是Pandas的進階學習者,都會對這三個方法有更深入的理解。

        本文演示的數(shù)據(jù)集是模擬生成的,想練手的可以按下方的代碼生成。

        boolean=[True,False]
        gender=["男","女"]
        color=["white","black","yellow"]
        data=pd.DataFrame({
        ????"height":np.random.randint(150,190,100),
        ????"weight":np.random.randint(40,90,100),
        ????"smoker":[boolean[x]?for?x?in?np.random.randint(0,2,100)],
        ????"gender":[gender[x]?for?x?in?np.random.randint(0,2,100)],
        ????"age":np.random.randint(15,90,100),
        ????"color":[color[x]?for?x?in?np.random.randint(0,len(color),100)?]
        }
        )

        數(shù)據(jù)集如下所示,各列分別代表身高、體重、是否吸煙、性別、年齡和膚色。

        19816ba207278dc83220dfa0f5c1a363.webp



        Series數(shù)據(jù)處理




        map

        如果需要把數(shù)據(jù)集中gender列的男替換為1,女替換為0,怎么做呢?絕對不是用for循環(huán)實現(xiàn)?。?!使用Series.map()可以很容易做到,最少僅需一行代碼。

        #①使用字典進行映射
        data["gender"]?=?data["gender"].map({"男":1,?"女":0})

        #②使用函數(shù)
        def?gender_map(x):
        ????gender?=?1?if?x?==?"男"?else?0
        ????return?gender
        #注意這里傳入的是函數(shù)名,不帶括號
        data["gender"]?=?data["gender"].map(gender_map)

        map在實際過程中是怎么運行的呢?請看下面的圖解(為了方便展示,僅截取了前10條數(shù)據(jù))

        750e78647f96905f655989eb5cd16fc1.webpc9d9a96fa49c9ec41437ff7bafd93184.webp

        不論是利用字典還是函數(shù)進行映射,map方法都是把對應(yīng)的數(shù)據(jù)逐個當作參數(shù)傳入到字典或函數(shù)中,得到映射后的值。

        apply

        同時Series對象還有apply方法,apply方法的作用原理和map方法類似,區(qū)別在于apply能夠傳入功能更為復雜的函數(shù)。怎么理解呢?一起看看下面的例子。

        假設(shè)在數(shù)據(jù)統(tǒng)計的過程中,年齡age列有較大誤差,需要對其進行調(diào)整(加上或減去一個值),由于這個加上或減去的值未知,故在定義函數(shù)時,需要加多一個參數(shù)bias,此時用map方法是操作不了的(傳入map的函數(shù)只能接收一個參數(shù)),apply方法則可以解決這個問題。

        def?apply_age(x,bias):
        ????return?x+bias

        #以元組的方式傳入額外的參數(shù)
        data["age"]?=?data["age"].apply(apply_age,args=(-3,))

        ea76a966c74146701fab8cc0992e5d3f.webp

        可以看到age列都減了3,當然,這里只是簡單舉了個例子,當需要進行復雜處理時,更能體現(xiàn)apply的作用。

        總而言之,對于Series而言,map可以解決絕大多數(shù)的數(shù)據(jù)處理需求,但如果需要使用較為復雜的函數(shù),則需要用到apply方法。


        DataFrame數(shù)據(jù)處理


        apply

        DataFrame而言,apply是非常重要的數(shù)據(jù)處理方法,它可以接收各種各樣的函數(shù)(Python內(nèi)置的或自定義的),處理方式很靈活,下面通過幾個例子來看看apply的具體使用及其原理。

        在進行具體介紹之前,首先需要介紹一下DataFrameaxis的概念,在DataFrame對象的大多數(shù)方法中,都會有axis這個參數(shù),它控制了你指定的操作是沿著0軸還是1軸進行。axis=0代表操作對列columns進行,axis=1代表操作對行row進行,如下圖所示。

        427b9099abfa4c1828c1c3878a7394a4.webp

        如果還不是很了解,沒關(guān)系,下面會分別對apply沿著0軸以及1軸的操作進行講解,繼續(xù)往下走。

        假設(shè)現(xiàn)在需要對data中的數(shù)值列分別進行取對數(shù)求和的操作,這時可以用apply進行相應(yīng)的操作,因為是對列進行操作,所以需要指定axis=0,使用下面的兩行代碼可以很輕松地解決我們的問題。

        #?沿著0軸求和
        data[["height","weight","age"]].apply(np.sum,?axis=0)

        #?沿著0軸取對數(shù)
        data[["height","weight","age"]].apply(np.log,?axis=0)

        實現(xiàn)的方式很簡單,但調(diào)用apply時究竟發(fā)生了什么呢?過程是怎么實現(xiàn)的?還是通過圖解的方式來一探究竟。(取前五條數(shù)據(jù)為例)

        464cf1520e74a2d11d6579331292b98c.webp
        16c6afb4cf8900db54e2a5b4ad1beaf3.webp

        當沿著軸0(axis=0)進行操作時,會將各列(columns)默認以Series的形式作為參數(shù),傳入到你指定的操作函數(shù)中,操作后合并并返回相應(yīng)的結(jié)果。

        那如果在實際使用中需要按行進行操作(axis=1),那整個過程又是怎么實現(xiàn)的呢?

        在數(shù)據(jù)集中,有身高和體重的數(shù)據(jù),所以根據(jù)這個,我們可以計算每個人的BMI指數(shù)(體檢時常用的指標,衡量人體肥胖程度和是否健康的重要標準),計算公式是:體重指數(shù)BMI=體重/身高的平方(國際單位kg/㎡),因為需要對每個樣本進行操作,這里使用axis=1apply進行操作,代碼如下:

        def?BMI(series):
        ????weight?=?series["weight"]
        ????height?=?series["height"]/100
        ????BMI?=?weight/height**2
        ????return?BMI

        data["BMI"]?=?data.apply(BMI,axis=1)

        還是用圖解的方式來看看這個過程到底是怎么實現(xiàn)的(以前5條數(shù)據(jù)為例)。

        fc5d30d1158933ffb020edfbfc70dbcc.webp

        apply設(shè)置了axis=1對行進行操作時,會默認將每一行數(shù)據(jù)以Series的形式(Series的索引為列名)傳入指定函數(shù),返回相應(yīng)的結(jié)果。

        總結(jié)一下對DataFrameapply操作:

        1. axis=0時,對每列columns執(zhí)行指定函數(shù);當axis=1時,對每行row執(zhí)行指定函數(shù)。

        2. 無論axis=0還是axis=1,其傳入指定函數(shù)的默認形式均為Series,可以通過設(shè)置raw=True傳入numpy數(shù)組。

        3. 對每個Series執(zhí)行結(jié)果后,會將結(jié)果整合在一起返回(若想有返回值,定義函數(shù)時需要return相應(yīng)的值)

        4. 當然,DataFrameapplySeriesapply一樣,也能接收更復雜的函數(shù),如傳入?yún)?shù)等,實現(xiàn)原理是一樣的,具體用法詳見官方文檔。

        applymap

        applymap的用法比較簡單,會對DataFrame中的每個單元格執(zhí)行指定函數(shù)的操作,雖然用途不如apply廣泛,但在某些場合下還是比較有用的,如下面這個例子。

        為了演示的方便,新生成一個DataFrame

        df?=?pd.DataFrame(
        ????{
        ????????"A":np.random.randn(5),
        ????????"B":np.random.randn(5),
        ????????"C":np.random.randn(5),
        ????????"D":np.random.randn(5),
        ????????"E":np.random.randn(5),
        ????}
        )
        df
        4d84a7ca1f21273c1950a9ac09845113.webp

        現(xiàn)在想將DataFrame中所有的值保留兩位小數(shù)顯示,使用applymap可以很快達到你想要的目的,代碼和圖解如下:

        df.applymap(lambda?x:"%.2f"?%?x)
        3c931b726204fcbadc3d280a4b2a6576.webp

        數(shù)據(jù)處理三板斧就介紹到這里,有問題歡迎下方留言板積極留言呀!

        ◆?◆?◆ ?◆?



        長按二維碼關(guān)注我們



        數(shù)據(jù)森麟公眾號的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關(guān)于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關(guān)內(nèi)容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進群前一定要關(guān)注公眾號奧,關(guān)注后讓管理員幫忙拉進群,期待大家的加入。


        管理員二維碼:


        猜你喜歡

        ?笑死人不償命的知乎沙雕問題排行榜

        ?用Python扒出B站那些“驚為天人”的阿婆主!

        ?互聯(lián)網(wǎng)大佬學歷&背景大揭秘,看看是你的老鄉(xiāng)還是校友

        ?上萬條數(shù)據(jù)撕開微博熱搜的真相!

        ?你相信逛B站也能學編程嗎??

        瀏覽 36
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        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>
            亚洲艹 | 国产精品国产三级国产专区51 | 揉我胸啊嗯上课呢口述 | 国语少妇新婚之夜对白性视频 | 国产伦精品一区二区三区照片 | 国产豆花视频永久在线观看 | 男男骨科腐肉汁躁h文小少爷 | 日本丰满少妇bbbbbb黑人 | 欧美日bb | 毛片1000部免费看 |