(數據科學學習手札97)掌握pandas中的transform

本文示例文件已上傳至我的Github倉庫//github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  開門見山,在pandas中,transform是一類非常實用的方法,通過它我們可以很方便地將某個或某些函數處理過程(非聚合)作用在傳入數據的每一列上,從而返回與輸入數據形狀一致的運算結果。

  本文就將帶大家掌握pandas中關於transform的一些常用使用方式。

圖1

2 pandas中的transform

  在pandastransform根據作用對象和場景的不同,主要可分為以下幾種:

2.1 transform作用於Series

  當transform作用於單列Series時較為簡單,以前段時間非常流行的企鵝數據集為例:

圖2

我們在讀入數據後,對bill_length_mm列進行transform變換:

  • 單個變換函數

  我們可以傳入任意的非聚合類函數,譬如對數化:

# 對數化
penguins['bill_length_mm'].transform(np.log)

圖3

  或者傳入lambda函數:

# lambda函數
penguins['bill_length_mm'].transform(lambda s: s+1)

圖4

  • 多個變換函數

  也可以傳入包含多個變換函數的列表來一口氣計算出多列結果:

penguins['bill_length_mm'].transform([np.log, 
                                      lambda s: s+1, 
                                      np.sqrt])

圖5

  而又因為transform傳入的函數,在執行運算時接收的輸入參數是對應的整列數據,所以我們可以利用這個特點實現諸如數據標準化歸一化等需要依賴樣本整體統計特徵的變換過程:

# 利用transform進行數據標準化
penguins['bill_length_mm'].transform(lambda s: (s - s.mean()) / s.std())

圖6

2.2 transform作用於DataFrame

  當transform作用於整個DataFrame時,實際上就是將傳入的所有變換函數作用到每一列中:

# 分別對每列進行標準化
(
    penguins
    .loc[:, 'bill_length_mm': 'body_mass_g']
    .transform(lambda s: (s - s.mean()) / s.std())
)

圖7

  而當傳入多個變換函數時,對應的返回結果格式類似agg中的機制,會生成MultiIndex格式的字段名:

(
    penguins
    .loc[:, 'bill_length_mm': 'body_mass_g']
    .transform([np.log, lambda s: s+1])
)

圖8

  而且由於作用的是DataFrame,還可以利用字典以鍵值對的形式,一口氣為每一列配置單個或多個變換函數:

# 根據字典為不同的列配置不同的變換函數
(
    penguins
    .loc[:, 'bill_length_mm': 'body_mass_g']
    .transform({'bill_length_mm': np.log,
                'bill_depth_mm': lambda s: (s - s.mean()) / s.std(),
                'flipper_length_mm': np.log,
                'body_mass_g': [np.log, np.sqrt]})
)

圖9

2.3 transform作用於DataFrame的分組過程

  在對DataFrame進行分組操作時,配合transform可以完成很多有用的任務,譬如對缺失值進行填充時,根據分組內部的均值進行填充:

# 分組進行缺失值均值填充
(
    penguins
    .groupby('species')[['bill_length_mm', 'bill_depth_mm', 
                         'flipper_length_mm', 'body_mass_g']]
    .transform(lambda s: s.fillna(s.mean().round(2)))
)

圖10

  並且在pandas1.1.0版本之後為transform引入了新特性,可以配合CythonNumba來實現更高性能的數據變換操作,詳細的可以閱讀( //github.com/pandas-dev/pandas/pull/32854 )了解更多。

  除了以上介紹的內容外,transform還可以配合時間序列類的操作譬如resample等,功能都大差不差,感興趣的朋友可以自行了解。


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