聚合只不过是分组运算的其中一种而已。它是数据转换的一个特例,也就是说,它接受能够将一维数组简化为标量值的函数。接下来介绍的transform和apply方法,它们能够执行更多其他的分组运算。
i)添加用于存放各索引分组平均值的列
假设我们想要为一个DataFrame添加一个用于存放各索引分组平均值的列。一个办法是先聚合再合并:
先聚合:
再合并:
虽然这样也行,但是不太灵活。你可以将该过程看作利用np.mean函数对两个数据列进行转换
ii)在GroupBy对象上使用transform方法
跟aggregate一样,transform也是一个有着严格条件的特殊函数:传入的函数只能产生两种结果,要么产生一个可以广播的标量值(如np.mean),要么产生一个相同大小的结果数组。
不难看出,transform会将一个函数应用到各个分组,然后将结果放置到合适的位置上。如果各分组产生的是一个标量值,则该值就会被广播(broadcast)出去。
现在,假设你希望从各分组中减去平均值。为此,我们先创建一个距平化函数(demeaning function),然后将其传给transform:
apply:一般性的“拆分-应用-合并”
最一般化的GroupBy方法是apply,重点讲解它。如下图所示,apply会将待处理的对象拆分成多个片段,然后对各片段调用传入的函数,最后尝试将各片段组合到一起。
回到之前的小费数据集,假设你想要根据分组选出最高的5个tip_pct值。首先,编写一个选取指定列中具有前n个最大值的行的函数: