(資料科學學習手札97)掌握pandas中的transform

費弗裡發表於2020-10-14

本文示例檔案已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

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

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

(資料科學學習手札97)掌握pandas中的transform
圖1

2 pandas中的transform

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

2.1 transform作用於Series

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

(資料科學學習手札97)掌握pandas中的transform
圖2

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

  • 單個變換函式

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

# 對數化
penguins['bill_length_mm'].transform(np.log)
(資料科學學習手札97)掌握pandas中的transform
圖3

  或者傳入lambda函式:

# lambda函式
penguins['bill_length_mm'].transform(lambda s: s+1)
(資料科學學習手札97)掌握pandas中的transform
圖4
  • 多個變換函式

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

penguins['bill_length_mm'].transform([np.log, 
                                      lambda s: s+1, 
                                      np.sqrt])
(資料科學學習手札97)掌握pandas中的transform
圖5

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

# 利用transform進行資料標準化
penguins['bill_length_mm'].transform(lambda s: (s - s.mean()) / s.std())
(資料科學學習手札97)掌握pandas中的transform
圖6

2.2 transform作用於DataFrame

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

# 分別對每列進行標準化
(
    penguins
    .loc[:, 'bill_length_mm': 'body_mass_g']
    .transform(lambda s: (s - s.mean()) / s.std())
)
(資料科學學習手札97)掌握pandas中的transform
圖7

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

(
    penguins
    .loc[:, 'bill_length_mm': 'body_mass_g']
    .transform([np.log, lambda s: s+1])
)
(資料科學學習手札97)掌握pandas中的transform
圖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]})
)
(資料科學學習手札97)掌握pandas中的transform
圖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)))
)
(資料科學學習手札97)掌握pandas中的transform
圖10

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

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


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

相關文章