<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Pandas知識點(diǎn)-詳解表級操作管道函數(shù)pipe

          共 3812字,需瀏覽 8分鐘

           ·

          2022-11-08 18:55

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


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



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

          • func: 用于對數(shù)據(jù)進(jìn)行表級處理的函數(shù),函數(shù)可以是內(nèi)置函數(shù)、庫函數(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()只對DataFrame進(jìn)行一次函數(shù)處理時(shí),它的效果等同于直接用函數(shù)對DataFrame處理:func(df),與apply()、applymap()、map()等的處理結(jié)果也一樣。


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


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



          先看如下三個(gè)函數(shù)對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ù)依次對DataFrame進(jìn)行一步處理,前一個(gè)函數(shù)的輸出是后一個(gè)函數(shù)的輸入。

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


          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ù)嵌套在一起寫的最終結(jié)果沒有改變,功能上沒有問題。

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

          遇到類似的情況,非常適合使用pipe()來鏈?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()就像一根管道一樣。

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

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

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

          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


          寫Python代碼時(shí),在需要換行的代碼外層加上括號,換行后不會報(bào)錯(cuò),也不需要在換行的地方加反斜杠。此外,還可以調(diào)整代碼的縮進(jìn),將代碼對齊,大大提高可讀性。這種方式在鏈?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()中,會報(bào)錯(cuò)。

          正確的傳參語法為元組(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中表級操作函數(shù)pipe()的用法介紹和分析,如果本文的內(nèi)容對你有幫助,歡迎點(diǎn)贊、在看和分享,也可以關(guān)注和聯(lián)系我一起交流討論。


          參考文檔: 

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


          相關(guān)閱讀??

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


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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久热最新视频在线观看 | 欧美性爱视频福利 | 日本黄色日批视频网站 | A片在线观看免费 | 五月天丁香色婷婷 |