1 簡介
我們在利用pandas
開展資料分析時,應儘量避免過於碎片化的組織程式碼,尤其是建立出過多不必要的中間變數,既浪費了記憶體,又帶來了關於變數命名的麻煩,更不利於整體分析過程程式碼的可讀性,因此以流水線方式組織程式碼非常有必要。
而在以前我撰寫的一些文章中,為大家介紹過pandas
中的eval()
和query()
這兩個幫助我們鏈式書寫程式碼,搭建資料分析工作流的實用API
,再加上下面要介紹的pipe()
,我們就可以將任意pandas
程式碼完美組織成流水線形式。
2 在pandas中靈活利用pipe()
pipe()
顧名思義,就是專門用於對Series
和DataFrame
操作進行流水線(pipeline)改造的API,其作用是將巢狀的函式呼叫過程改造為鏈式過程,其第一個引數func
傳入作用於對應Series
或DataFrame
的函式。
具體來說pipe()
有兩種使用方式,第一種方式下,傳入函式對應的第一個位置上的引數必須是目標Series
或DataFrame
,其他相關的引數使用常規的鍵值對方式傳入即可,就像下面的例子一樣,我們自編函式對泰坦尼克資料集進行一些基礎的特徵工程處理:
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()
中,我們將自編函式作為其第一個引數傳入,從而將一系列操作巧妙地嵌入到鏈式過程中。
第二種使用方式適合目標Series
和DataFrame
不為傳入函式第一個引數的情況,譬如下面的例子中我們假設目標輸入資料為第二個引數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)
)
在這樣的設計下我們可以避免很多函式巢狀呼叫方式,隨心所欲地優化我們的程式碼~
以上就是本文的全部內容,歡迎在評論區與我進行討論~