分组操作将一张表切分为多个块,并对每个块进行操作。
以species分组,并对petal求平均值
# coding: utf-8
from blaze import data, by
from blaze.utils import example
d = data('sqlite:///{}::iris'.format(example('iris.db')))
print(by(d.species, avg=d.petal_length.mean()).peek())对于描述许多有用的变换,split-apply-combine操作是一种简单而强大的方式。它被所有后端高效支持。
1. 参数
by方法有一个位置参数(决定如何对表进行分组)和多个关键字参数(对每一个份组执行的操作)。形式如下:
by(grouper, name=reduction, name=reduction, ...)例子:以species对iris数据集分组,并对每个分组计算petal_length的最小值、最大值和最大值与最小值间的差。
print(by(d.species, min=d.petal_length.min(), max=d.petal_length.max(),
         ratio=d.petal_length.max()-d.petal_length.min()).peek())输出:
           species  max  min  ratio
0      Iris-setosa  1.9  1.0    0.9
1  Iris-versicolor  5.1  3.0    2.1
2   Iris-virginica  6.9  4.5    2.42. 限制
与内存型的dataframes例如pandas或dplyr相比,这个接口有两个方面的限制:
- 必须同时指定分组方式和相应操作
- “apply”阶段必须是一个reduction
这些限制让它更方便向数据集传达你的意图,并有效分发和并行计算。
3. 不能做的事
不能只指定如何分组而没有指定对每个分组的操作,例如:
groups = by(mytable.mycolumn)  # Can't do this  不能指定non-reducing的apply操作(尽管有些后端通过改变而正常工作),例如:
groups = by(d.A, result=d.B / d.B.max())  # Can't do this 
                        
                        