12.2 高阶GroupBy 应用
12.2.1 分组转换和展开 groupby
之前我们使用apply方法来执行转换操作。还有一个内建方法transform方法,与apply方法类似,但是会对你可以使用的函数装来假设限制。
- transform可用产生一个标量值,并广播到各分组的尺寸数据中。
- 可以产生一个与输入分组尺寸相同的对象
- 不可改变它的输入
df=pd.DataFrame({
'key':['a','b','c']*4,'value':np.arange(12)})
g=df.groupby('key').value
g.mean()
key
a 4.5
b 5.5
c 6.5
Name: value, dtype: float64
g.transform(lambda x: x.mean()) # 产生一个series,尺寸和df['value‘]一样,但值按'key分组的均值代替。
0 4.5
1 5.5
2 6.5
3 4.5
4 5.5
5 6.5
6 4.5
7 5.5
8 6.5
9 4.5
10 5.5
11 6.5
Name: value, dtype: float64
g.transform('mean') # 也可以向groupbt 的 agg方法一样传递一个字符串别名。
g.transform(lambda x:x*2) # transform可以与返回series的函数一起使用,但结果必须和输入有相同的大小。
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
10 20
11 22
Name: value, dtype: int32
g.transform(lambda x: x.rank(ascending=False)) # 按照每个组的降序计算排名。
0 4
1 4
2 4
3 3
4 3
5 3
6 2
7 2
8 2
9 1
10 1
11 1
Name: value, dtype: int32
def normalize(x):
return (x - x.mean()) / x.std()
g.transform(normalize)==g.apply(normalize)
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
10 True
11 True
Name: value, dtype: bool
# 内建的聚合函数如mean or sum通常比apply函数更快,这些函数在与transform一起使用也会存在一个快速通过。
# 这允许我们执行一个所谓的展开分组操作<