简介
在之前的文章中我们就介绍了一些聚合方法,这些方法能够就地将数组转换成标量值。一些经过优化的groupby方法如下表所示:
方法 | 描述 |
---|---|
count | 计算分组中非NA值的数量 |
sum | 计算非NA值的和 |
mean | 计算非NA值的平均值 |
median | 计算非NA值的算术中位数 |
std、var | 计算非NA值标准差和方差 |
min、max | 获得非NA值的最小和最大值 |
prod | 计算非NA值的积 |
first、last | 获得第一个和最后一个非NA值 |
然而并不是只能使用这些方法,我们还可以定义自己的聚合函数,在这里就需要使用到agg方法。
自定义方法
假设我们有这样一个数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>>import numpy as np >>>import pandas as pd >>>df = pd.DataFrame({'k1': list('aabba'), 'k2': ['one', 'two', 'one', 'two', 'one'], 'value1': np.random.randn(5), 'value2': np.random.randn(5)}) >>>df k1 k2 value1 value2 0 a one 0.487768 3.194155 1 a two -1.798654 1.003257 2 b one 0.195446 -1.420604 3 b two -0.958120 -0.477421 4 a one -2.135973 0.239011 >>>g1 = df.groupby('k1') |
可以自定义一个计算最大和最小值的函数,并将这个函数传入agg方法中:
1 2 3 4 5 6 7 8 |
>>>def cal_size(x): return x.max() - x.min() >>>g1.agg(cal_size) value1 value2 k1 a 2.623741 2.955143 b 1.153565 0.943184 |
面向列的多函数
agg方法不仅能够使用单个函数,而且还能对不同的列使用不同的聚合函数,或一次使用多个函数。对于上面表格中列出的统计方法,可以将函数名以字符串形式写入;
1 2 3 4 5 |
>>>g1.agg('mean') value1 value2 k1 a -1.148953 1.478807 b -0.381337 -0.949012 |
还可以传入多个函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>>data = g1.agg(['mean', 'std', cal_size]) >>>data value1 value2 mean std cal_size mean std cal_size k1 a -1.148953 1.427441 2.623741 1.478807 1.533894 2.955143 b -0.381337 0.815694 1.153565 -0.949012 0.666931 0.943184 >>>data['value1'] mean std cal_size k1 a -1.148953 1.427441 2.623741 b -0.381337 0.815694 1.153565 |
当传入多个函数时,得到的列会以这个函数命名。如果想更改列名的话,我们可以传入一个 (name, function) 元组组成的列表。比如:
1 2 3 4 5 6 7 |
>>>data1 = g1.agg([('average', 'mean'), ('error', 'std'), ('size', cal_size)]) >>>data1 value1 value2 average error size average error size k1 a -1.148953 1.427441 2.623741 1.478807 1.533894 2.955143 b -0.381337 0.815694 1.153565 -0.949012 0.666931 0.943184 |
除此之外,我们还可以针对不同的列使用不同的函数,只需要传入一个字典包含列名到函数的映射:
1 2 3 4 5 |
>>>g1.agg({'value1': 'sum', 'value2': 'mean'}) value1 value2 k1 a -3.446859 1.478807 b -0.762674 -0.949012 |
在这里我们将对 value1 列使用 sum 函数,对 value2 列使用 mean 函数。
无索引形式
使用聚合方法得到的数据默认是把分组的列当成索引,有时候我们需要将分组索引也当成一列,此时就可以使用groupby方法中的 as_index=False 修改:
1 2 3 4 |
>>>df.groupby('k1', as_index=False).agg({'value1': 'sum', 'value2': 'mean'}) k1 value1 value2 0 a -3.446859 1.478807 1 b -0.762674 -0.949012 |
这样索引值就变成了默认的,数据中又包含了 k1 列。
总结
本文主要介绍agg方法的使用:可以调用自定义的函数;对一列使用多个函数;对不同的列使用不同的函数,最后介绍了无索引的处理方式。在后面的文章中我们还会讲到更多数据转换的函数,聚合方法只不过是其中的一种。