分组操作将一张表切分为多个块,并对每个块进行操作。
以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.4
2. 限制
与内存型的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