一、介紹
利用 transform
可以高效地匯總數據,直白的說:增加一列匯總列。
一般情況下,transform
與 groupby
組合使用。
使用語法:
Series.transform(func, axis=0, **kwargs)
二、實操
- 基礎用法
import pandas as pd
import numpy as np
df = pd.DataFrame({'A':range(3),
'B':range(1,4)})
df
'''
A B
0 0 1
1 1 2
2 2 3
'''
# 整體 +1
df.transform(lambda x: x+1)
s = pd.Series(range(3))
s.transform([np.sqrt, np.exp])
'''
sqrt exp
0 0.000000 1.000000
1 1.000000 2.718282
2 1.414214 7.389056
'''
- 分組變換
input
→ split
→ apply(sum)
→ combine
df = pd.DataFrame({
"Date": [
"2015-05-08", "2015-05-07", "2015-05-06", "2015-05-05",
"2015-05-08", "2015-05-07", "2015-05-06", "2015-05-05"],
"Data": [5, 8, 6, 1, 50, 100, 60, 120],
})
df['sum'] = df.groupby('Date')['Data'].transform(sum)
df['size'] = df.groupby('Date')['Data'].transform(len)
df
'''
Date Data sum size
0 2015-05-08 5 55 2
1 2015-05-07 8 108 2
2 2015-05-06 6 66 2
3 2015-05-05 1 121 2
4 2015-05-08 50 55 2
5 2015-05-07 100 108 2
6 2015-05-06 60 66 2
7 2015-05-05 120 121 2
'''
不使用 transform
方法進行變換。
temp = df.groupby('Date')['Data'].sum().rename('Total').reset_index()
df_2 = pd.merge(df, temp, how='left')
df_2['percent'] = df_2['Data']/df_2['Total']
'''
Date Data sum size Total percent
0 2015-05-08 5 55 2 55 0.090909
1 2015-05-07 8 108 2 108 0.074074
2 2015-05-06 6 66 2 66 0.090909
3 2015-05-05 1 121 2 121 0.008264
4 2015-05-08 50 55 2 55 0.909091
5 2015-05-07 100 108 2 108 0.925926
6 2015-05-06 60 66 2 66 0.909091
7 2015-05-05 120 121 2 121 0.991736
'''
三、apply 和 transform 結合對比
在與 apply()
一起使用時,transform
需要進行去重操作,一般是通過指定一或多個列完成。
此外,匿名函數永遠不是一個很好的辦法,在進行簡單計算時,無論是使用 transfrom
、agg
還是 apply
,都要盡可能使用自帶方法!!!
apply
方法可以結合 joblib
多線程、多進程模塊構造相應的函數執行計算,加快計算速度。