《利用Python进行数据分析》 10.2数据聚合
10.2数据聚合
1.聚合是指所有根据数组产生标量值得数据转换过程
例如mean、count、min、sum都是聚合操作。常见的聚合,例如表10-1中的操作都有了优化实现。
图10-1:优化的groupby方法2.使用自行制定的聚合,并再调用已经在分组对象上定义好的方法
示例:使用Series方法quantile聚合,在内部,GroupBy有效的对Series进行切片,为每一块调用piece.quantile(0.9),然后将结果组装到对象中(见图10-2)
图10-2:使用Series方法quantile聚合注:(1)Series.quantile(q=0.5,interpolation='linear')
Return value at the given quantile, a la numpy.percentile.
(2)分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点
图10-3:使用自己的聚合函数3.使用自己定义的聚合函数,需要将函数传递给aggregate或agg方法(见图10-3)
图10-4:describe()方法4.尽管一些方法不是聚合函数,但是其也是有效的,比如describe()(如图10-4)
注:(1)DataFrame.describe(percentile_width=None,percentiles=None,include=None,exclude=None)
Generate various summary statistics, excluding NaN values.
(2)自定义聚合函数通常比图10-1中的优化函数慢得多。这是因为在构造中间组数据块时有一些额外的开销(函数调用、数据重新排列)
10.2.1 逐列及多函数应用
1.示例:数据聚合之小费数据集
(1)使用read_csv载入数据集(数据集见图10-5)
10-5:文件部分数据集(2)增加小费列tip-pct(见图10-6)
图10-6:增加小费列tip_pct(3)对Series或DataFrame所有列进行聚合就是使用aggregate和所需函数,或者是调用像mean或std这种方法
根据各列同时使用多个函数进行聚合
先根据day和smoker来对tips进行分组,将函数名以字符串形式传递(见图10-7)
图10-7:分组与函数名以字符串传递(4)如果传递函数或者函数名的列表,你会获得一个列名是这些函数名的DataFrame(见图10-8)
图10-8:传递函数名列表注:当我们传递了聚合函数的列表给agg方法,这些函数会各自运用于数据分组
(5)当我们不接受GroupBy对象给予各列的名称
传递(name, function)元组的列表,每个元组的第一个元素将作为DataFrame的列名(你可以认为二元元组的列表是一种有序的对应关系)(见图10-9)
图10-9:传递(name, function)元组的列表(6)在DataFrame中,你有更多的选项,你可以指定应用到所有列上的函数列表或每一列上要应用的不同函数(见图10-10)(同样的函数应用到不同的列)
图10-10:计算tip_pct列和total_bill列的三个相同的统计值注:产生的DataFrame拥有分层列,与分别聚合每一列,再以列名作为keys参数使用concat将结果拼接在一起的结果相同(见图10-11)
图10-11:tip_pct示例(7)传递具有自定义名称的元组列表(见图10-12)
图10-12:传递自定义名称的元组列表(8)将不同的函数应用到一个或多个列上。要实现这个功能,需要将含有列名与函数对应关系的字典传递给agg(见图10-13)
图10-13:不同的函数应用在不同的列注:
多个函数应用于至少一个列时,DataFrame才具有分层列
10.2.2 返回不含行索引的聚合数据
1.传递as_index=False禁用分组键作为索引
聚合数据返回时都是带有索引的,有时索引是分层的,由唯一的分组键联合形成。因为不是所有的情况下都需要索引,所以在大多数情况下你可以通过向groupby传递as_index=False来禁用分组键作为索引的行为(见图10-14)
图10-14:传递as_index=False禁用分组键作为索引2.结果上调用reset_index禁用分组键作为索引
推荐使用as_index=False以避免一些不必要的计算。
图10-15:调用reset_index禁用分组键作为索引