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í)點(diǎn)-詳解表級(jí)操作管道函數(shù)pipe

        共 3812字,需瀏覽 8分鐘

         ·

        2022-11-08 18:55

        前面的文章介紹過(guò)Pandas中的元素級(jí)處理函數(shù)和行列級(jí)處理函數(shù),本文介紹表級(jí)的處理函數(shù)DataFrame.pipe(),pipe()常被稱(chēng)為管道函數(shù)。


        pipe()參數(shù)和用法介紹 



        pipe(func, *args, **kwargs):

        • func: 用于對(duì)數(shù)據(jù)進(jìn)行表級(jí)處理的函數(shù),函數(shù)可以是內(nèi)置函數(shù)、庫(kù)函數(shù)、自定義函數(shù)或匿名函數(shù)。
        • *args: 傳遞給函數(shù)func的位置參數(shù)。
        • **kwargs: 傳遞給函數(shù)func的關(guān)鍵字參數(shù)。

        返回?cái)?shù)據(jù):

        • 返回一個(gè)新的DataFrame。

        pipe()函數(shù)基本使用 



        # coding=utf-8
        import pandas as pd
        import numpy as np

        df = pd.DataFrame({'Col-1': [135], 'Col-2': [579]})
        print(df)
        res = df.pipe(np.square)
        print('-'*30'\n', res, sep='')
           Col-1  Col-2
        0 1 5
        1 3 7
        2 5 9
        ------------------------------
        Col-1 Col-2
        0 1 25
        1 9 49
        2 25 81

        當(dāng)pipe()只對(duì)DataFrame進(jìn)行一次函數(shù)處理時(shí),它的效果等同于直接用函數(shù)對(duì)DataFrame處理:func(df),與apply()、applymap()、map()等的處理結(jié)果也一樣。


        如果只對(duì)DataFrame做一次處理,建議使用apply(),pipe()函數(shù)的精髓在于對(duì)DataFrame做多次處理時(shí),使用鏈?zhǔn)秸{(diào)用。


        pipe()函數(shù)鏈?zhǔn)秸{(diào)用 



        先看如下三個(gè)函數(shù)對(duì)DataFrame的處理。

        df_one = np.square(df)
        print('-'*30'\n', df_one, sep='')
        df_two = np.multiply(df_one, 2)
        print('-'*30'\n', df_two, sep='')
        df_three = np.add(df_two, 10)
        print('-'*30'\n', df_three, sep='')
        ------------------------------
        Col-1 Col-2
        0 1 25
        1 9 49
        2 25 81
        ------------------------------
        Col-1 Col-2
        0 2 50
        1 18 98
        2 50 162
        ------------------------------
        Col-1 Col-2
        0 12 60
        1 28 108
        2 60 172

        這三個(gè)函數(shù)依次對(duì)DataFrame進(jìn)行一步處理,前一個(gè)函數(shù)的輸出是后一個(gè)函數(shù)的輸入。

        這三個(gè)函數(shù)也可以嵌套在一起,寫(xiě)到一行代碼中。


        result = np.add(np.multiply(np.square(df), 2), 10)
        print('-'*30'\n', result, sep='')
        ------------------------------
        Col-1 Col-2
        0 12 60
        1 28 108
        2 60 172

        函數(shù)嵌套在一起寫(xiě)的最終結(jié)果沒(méi)有改變,功能上沒(méi)有問(wèn)題。

        但是可讀性不高,不夠Pythonic,不夠優(yōu)雅。如果嵌套的層數(shù)更多,甚至可能會(huì)誤導(dǎo)讀代碼的人。

        遇到類(lèi)似的情況,非常適合使用pipe()來(lái)鏈?zhǔn)秸{(diào)用,提高可讀性。


        pipe_result = df.pipe(np.square).pipe(np.multiply, 2).pipe(np.add, 10)
        print('-'*30'\n', pipe_result, sep='')
        ------------------------------
        Col-1 Col-2
        0 12 60
        1 28 108
        2 60 172

        使用pipe()進(jìn)行鏈?zhǔn)秸{(diào)用,將每個(gè)函數(shù)依次傳入到pipe()中,執(zhí)行完一個(gè)函數(shù),再將結(jié)果傳遞給鏈?zhǔn)秸{(diào)用的下一個(gè)函數(shù),pipe()就像一根管道一樣。

        這樣看起來(lái)不僅先后順序一目了然,而且邏輯清晰,可讀性非常高,非常優(yōu)雅。

        在數(shù)據(jù)分析時(shí),對(duì)數(shù)據(jù)做多次處理是非常正常的,這正是pipe()的最大用途。

        pipe()鏈?zhǔn)秸{(diào)用還有另一種寫(xiě)法,將所有的pipe()換行縮進(jìn)對(duì)齊。

        pipe_result = (df.pipe(np.square)
                         .pipe(np.multiply, 2)
                         .pipe(np.add, 10))
        print('-'*30'\n', pipe_result, sep='')
        ------------------------------
        Col-1 Col-2
        0 12 60
        1 28 108
        2 60 172


        寫(xiě)Python代碼時(shí),在需要換行的代碼外層加上括號(hào),換行后不會(huì)報(bào)錯(cuò),也不需要在換行的地方加反斜杠。此外,還可以調(diào)整代碼的縮進(jìn),將代碼對(duì)齊,大大提高可讀性。這種方式在鏈?zhǔn)秸{(diào)用時(shí)經(jīng)常使用。


        pipe()中func的另一種傳參方式



        def add_num(num, dfx):
            df_new = dfx.add(num)
            return df_new

        res = df.pipe((add_num, 'dfx'), 10)
        print('-'*30'\n', res, sep='')
        res = df.pipe((add_num, 'dfx'), num=100)
        print('-'*30'\n', res, sep='')
        ------------------------------
        Col-1 Col-2
        0 11 15
        1 13 17
        2 15 19
        ------------------------------
        Col-1 Col-2
        0 101 105
        1 103 107
        2 105 109


        pipe()中調(diào)用的大部分函數(shù)func的第一個(gè)參數(shù)都是接收DataFrame,所以pipe()默認(rèn)將DataFrame傳給func的第一個(gè)參數(shù)。

        但有一些函數(shù)不是在第一個(gè)參數(shù)接收DataFrame,如本例的add_num(num, dfx)函數(shù),這種情況如果直接將函數(shù)func傳到pipe()中,會(huì)報(bào)錯(cuò)。

        正確的傳參語(yǔ)法為元組(callable, data_keyword)的形式,callable指定在pipe()中調(diào)用的函數(shù),data_keyword指定將DataFrame傳給函數(shù)的哪一個(gè)參數(shù)(用字符串指定),函數(shù)func的其他參數(shù)傳遞方式不變,傳給*args和**kwargs。如df.pipe((add_num, 'dfx'), 10)表示將df傳遞給add_num()函數(shù)的第二個(gè)位置參數(shù)dfx。
        以上就是pandas中表級(jí)操作函數(shù)pipe()的用法介紹和分析,如果本文的內(nèi)容對(duì)你有幫助,歡迎點(diǎn)贊、在看和分享,也可以關(guān)注和聯(lián)系我一起交流討論。


        參考文檔: 

        [1] pandas中文網(wǎng):https://www.pypandas.cn/docs/


        相關(guān)閱讀??

        Pandas知識(shí)點(diǎn)-詳解轉(zhuǎn)換函數(shù)transform


        瀏覽 54
        點(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>
            日韩无码流出| 91嫖妓站街按摩店老熟女| 久久精品成人电影| 国产av天堂| 欧美A片视频| 婷婷五月丁香六月| 大香蕉尹人在线| 逼逼75大秀| 国产绿奴09-01| 性欧美一区二区|