本文示例檔案已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
開門見山,在pandas
中,transform
是一類非常實用的方法,通過它我們可以很方便地將某個或某些函式處理過程(非聚合)作用在傳入資料的每一列上,從而返回與輸入資料形狀一致的運算結果。
本文就將帶大家掌握pandas
中關於transform
的一些常用使用方式。
2 pandas中的transform
在pandas
中transform
根據作用物件和場景的不同,主要可分為以下幾種:
2.1 transform作用於Series
當transform
作用於單列Series
時較為簡單,以前段時間非常流行的企鵝資料集為例:
我們在讀入資料後,對bill_length_mm
列進行transform
變換:
- 單個變換函式
我們可以傳入任意的非聚合類函式,譬如對數化:
# 對數化
penguins['bill_length_mm'].transform(np.log)
或者傳入lambda函式:
# lambda函式
penguins['bill_length_mm'].transform(lambda s: s+1)
- 多個變換函式
也可以傳入包含多個變換函式的列表來一口氣計算出多列結果:
penguins['bill_length_mm'].transform([np.log,
lambda s: s+1,
np.sqrt])
而又因為transform
傳入的函式,在執行運算時接收的輸入引數是對應的整列資料,所以我們可以利用這個特點實現諸如資料標準化、歸一化等需要依賴樣本整體統計特徵的變換過程:
# 利用transform進行資料標準化
penguins['bill_length_mm'].transform(lambda s: (s - s.mean()) / s.std())
2.2 transform作用於DataFrame
當transform
作用於整個DataFrame
時,實際上就是將傳入的所有變換函式作用到每一列中:
# 分別對每列進行標準化
(
penguins
.loc[:, 'bill_length_mm': 'body_mass_g']
.transform(lambda s: (s - s.mean()) / s.std())
)
而當傳入多個變換函式時,對應的返回結果格式類似agg
中的機制,會生成MultiIndex
格式的欄位名:
(
penguins
.loc[:, 'bill_length_mm': 'body_mass_g']
.transform([np.log, lambda s: s+1])
)
而且由於作用的是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]})
)
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)))
)
並且在pandas
1.1.0版本之後為transform
引入了新特性,可以配合Cython
或Numba
來實現更高效能的資料變換操作,詳細的可以閱讀( https://github.com/pandas-dev/pandas/pull/32854 )瞭解更多。
除了以上介紹的內容外,transform
還可以配合時間序列類的操作譬如resample
等,功能都大差不差,感興趣的朋友可以自行了解。
以上就是本文的全部內容,歡迎在評論區與我進行討論