在pandas中使用pipe()提升代碼可讀性


1 簡介

  我們在利用pandas開展數據分析時,應盡量避免過於碎片化的組織代碼,尤其是創建出過多不必要的中間變量,既浪費了內存,又帶來了關於變量命名的麻煩,更不利於整體分析過程代碼的可讀性,因此以流水線方式組織代碼非常有必要。

圖1

  而在以前我撰寫的一些文章中,為大家介紹過pandas中的eval()query()這兩個幫助我們鏈式書寫代碼,搭建數據分析工作流的實用API,再加上下面要介紹的pipe(),我們就可以將任意pandas代碼完美組織成流水線形式。

2 在pandas中靈活利用pipe()

  pipe()顧名思義,就是專門用於對SeriesDataFrame操作進行流水線(pipeline)改造的API,其作用是將嵌套的函數調用過程改造為鏈式過程,其第一個參數func傳入作用於對應SeriesDataFrame的函數。

  具體來說pipe()有兩種使用方式,第一種方式下,傳入函數對應的第一個位置上的參數必須是目標SeriesDataFrame,其他相關的參數使用常規的鍵值對方式傳入即可,就像下面的例子一樣,我們自編函數對泰坦尼克數據集進行一些基礎的特征工程處理:

import pandas as pd

train = pd.read_csv('train.csv')

def do_something(data, dummy_columns):
    '''
    自編示例函數
    '''

    data = (
        pd
        # 對指定列生成啞變量
        .get_dummies(data, # 先刪除data中指定列
                     columns=dummy_columns,
                     drop_first=True)
    )
    
    return data

# 鏈式流水線
(
    train
    # 將Pclass列轉換為字符型以便之后的啞變量處理
    .eval('Pclass=Pclass.astype("str")', engine='python')
    # 刪除指定列
    .drop(columns=['PassengerId', 'Name', 'Cabin', 'Ticket'])
    # 利用pipe以鏈式的方式調用自編函數
    .pipe(do_something, 
          dummy_columns=['Pclass', 'Sex', 'Embarked'])
    # 刪除含有缺失值的行
    .dropna()
)

  可以看到,在緊接着drop()下一步的pipe()中,我們將自編函數作為其第一個參數傳入,從而將一系列操作巧妙地嵌入到鏈式過程中。

  第二種使用方式適合目標SeriesDataFrame不為傳入函數第一個參數的情況,譬如下面的例子中我們假設目標輸入數據為第二個參數data2,則pipe()的第一個參數應以(函數名, '參數名稱')的格式傳入:

def do_something(data1, data2, axis):
    '''
    自編示例函數
    '''

    data = (
        pd
        .concat([data1, data2], axis=axis)
    )
    
    return data

# pipe()第二種使用方式
(
    train
    .pipe((do_something, 'data2'), data1=train, axis=0)
)

  在這樣的設計下我們可以避免很多函數嵌套調用方式,隨心所欲地優化我們的代碼~


  以上就是本文的全部內容,歡迎在評論區與我進行討論~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM