第十二章 高阶pandas
12.2 高阶GroupBy应用
12.2.1 分组转换和“展开”GroupBy
内建方法transform,与apply方法类似但是会对你可以使用的函数种类加上更多的限制:
· transform可以产生一个标量值,并广播到各分组的尺寸数据中
· transform可以产生一个与输入分组尺寸相同的对象
· transform不可改变它的输入
示例:
操作1:按key取均值(见图12-1)

操作2:产生一个Series,它的尺寸和df['value']一样,但值都被按’key'分组的均值替代(见图12-2)

操作3:与apply类似,transform可以与返回Series的函数一起使用,但结果必须和输入有相同的大小。例如,我们可以使用lambda函数给每个组乘以2。(见图12-3)

操作4:一个更复杂的例子,我们可以按照每个组的降序计算排名(见图12-4)

操作5:一个由简单聚合构成的分组转换函数,使用transform或apply可以获得等价的结果(见图12-5)

操作6:内建的聚合函数如’mean’或’sum’通常会比apply函数更快。这些函数在与transform一起使用时也会存在一个"快速通过"。这允许我们执行一个所谓的展开分组操作。(见图12-6)

注:然而一个展开分组操作可能会包含多个分组聚合,矢量化操作的整体优势往往超过了这一点
12.2.2 分组的时间重新采样
对于时间序列数据,resample方法在语义上是一种基于时间分段的分组操作。(见图12-7)

按‘time’进行索引,然后重新采样(见图12-8)

假设DataFrame包含多个时间序列,并按一个附加的分组键列进行了标记(见图12-9)

要为每个’key’的值进行相同的重新采样,我们可以使用pandas.TimeGrouper对象(见图12-10)

设置时间索引,按’key’和time_key进行分组,再聚合(见图12-11)

注:使用TimeGrouper的一个限制是时间必须是Series或DataFrame的索引。
网友评论