groupby(keys)函数是pandas中的一种很有用的分组运算,其可以通过参数keys指定列,通过指定的列对DataFrame进行分组,返回一个groupby对象,其是一个由对应的(name,groupby_object)元组组成的可迭代对象。分组之后,目的是为了进行每组的聚合运算,因此必须对groupby对象进行聚合运算,得到最终的DataFrame。
如下代码运行示例,先构造一个df,然后指定keys进行分组,得到grouped,其是一个groupby对象,然后对每组求均值,可以直接调用mean()。这里只要是Series中的函数都可以直接这样调用,因为可以把每个分组直接看成是分开的Series。最后便可以得到每组对应的均值结果。这里mean()就是一个聚合运算。
df
Out[37]:
c1 c2 c3 keys
0 0 1 2 a
1 3 4 5 b
2 6 7 8 c
3 9 10 11 c
4 12 13 14 b
5 15 16 17 c
6 18 19 20 a
7 21 22 23 a
8 24 25 26 b
grouped=df.groupby('keys')
grouped.mean()
Out[39]:
c1 c2 c3
keys
a 13 14 15
b 13 14 15
c 10 11 12
此外,这里对每个分组进行处理的函数不一定是Series预定义的函数,还可以是自己定义的函数,然后通过groupby对象的agg()函数传入即可。如下代码示例,先自己定义了一个test函数,其作用是返回一个Series的极差。分组之后,可以通过groupby对象的agg(func)函数,其中参数func就是要传入的函数名称,之后便可以得到每组的极差。如果需要对聚合函数处理之后的列指定一个名称(如果没指定,就默认为函数名),那么可以以元组组成的列表传给参数,其中元组的第一个元素会被认为是列名,当然这里可以传入多个元组,即可以传入多个聚合函数对每组进行处理,如此处理后便会出现列的层次索引。
如果需要对不同的列进行不同的处理,则可以传入字典,其中键值为对应的列名,值为函数名。当然,这里的值也可以是前述的元组,或者元组列表,以对同一列进行不同的处理,并且重命名。
def test(x):
return x.max()-x.min()
grouped.agg(test)
Out[47]:
c1 c2 c3
keys
a 21 21 21
b 21 21 21
c 9 9 9
如果是对有多层次索引的DataFrame,也可以通过groupby()的level参数指定哪一个层次的索引进行分组,这个level参数可以是层次索引的名称标签,也可以是在层次索引中的位置。
groupby()函数对DataFrame先分组,然后再通过预定义的或者自定义的聚合函数进行每组的运算,最后得到以分组的列为索引的DataFrame;这是数据处理中很常用的一个过程,对于这个过程,pandas中可以直接通过groupby()函数实现,即高效又简便。