一、介绍
利用 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
多线程、多进程模块构造相应的函数执行计算,加快计算速度。