数据聚合
聚合是指所有根据数组产生标量值的数据转换过程。之前的例子已经使用了一些聚合操作,包括mean、count、min和sum等。
下表展示了优化的groupby方法。
可以使用自行制定的聚合,并再调用已经在分组对象上定义好的方法。
尽管quantile并不是显式地为GroupBy对象实现的,但它是Series的方法,因此也可以用于聚合。在内部,GroupBy有效地对Series进行切片,为每一块调用piece. quantile(0.9),然后将这些结果一起组装到结果对象中:
要使用你自己的聚合函数,需要将函数传递给aggregate或agg方法:
一些方法,比如describe也是有效的,尽管严格来说它们并不是聚合函数:
注意:自定义聚合函数通常比表10-1中的优化函数慢得多。这是因为在构造中间组数据块时有一些额外的开销(函数调用、数据重新排列)。
1、逐列及多函数应用
让我们回到之前例子中的小费数据集。在使用read_csv载入数据集后,增加一个小费比例列tip-pct:
对Series或DataFrame所有列进行聚合就是使用aggregate和所需函数,或者是调用像mean或std这种方法的。首先,将根据day和smoker来对tips进行分组:
可以将函数名以字符串形式传递:
如果传递的是函数或者函数名的列表,会获得一个列名是这些函数名的DataFrame:
传递了聚合函数的列表给agg方法,这些函数会各自运用于数据分组。
在DataFrame中,有更多的选项,可以指定应用到所有列上的函数列表或每一列上要应用的不同函数。计算tip_pct列和total_bill列的三个相同的统计值:
产生的DataFrame拥有分层列,与分别聚合每一列,再以列名作为keys参数使用concat将结果拼接在一起的结果相同:
2、返回不含行索引的聚合数据
在前面所有的例子中,聚合数据返回时都是带有索引的,有时索引是分层的,由唯一的分组键联合形成。因为不是所有的情况下都需要索引,所以在大多数情况下可以通过向groupby传递as_index=False来禁用分组键作为索引的行为:
当然,通过在结果上调用reset_index也可以获得同样的结果。使用as_index=False可以避免一些不必要的计算。