2018/4/16 15:08:19当前位置推荐好文程序员浏览文章

GroupBy技术

分组运算的第一步就是将数据按照肯定的要求拆分成多个组,第二步是将函数应消耗到各个分组,第三步,将这些结果合并。下图大致说明了这个过程。


拆分-应消耗-合并

比方对于一个DataFrame,想按key1分组,并计算data1列的平均值。一种简单的做法就是使消耗GroupBy:
grouped = df[data1].groupby(df[key1])
grouped是一个GroupBy对象,只是按照要求,对df按key1分组,取出了data1列的值。而后,我们即可以对grouped.mean()就可计算分组的平均值。grouped.size()会返回分组大小的Series。

对分组进行迭代

GroupBy对象是支持迭代的,所以:

for (k1,k2),group in df.groupby([key1,key2]):    print k1,k2    print group

k1,k2对应key1,key2。


迭代GroupBy对象

有趣的是能把这个数据片段做成字典:

pieces = dict(list(df.groupby(key1)))pieces[b]#即可以得到按照key1分组后,key1=b的数据了。

选取一个或者一组列

对于由DataFrame产生的GroupBy对象.假如消耗一个(单个字符串)或者一组(字符串数组)列名对其进行索引,就可以实现选取部分列进行聚合的目的。也就是说:

df.groupby(key1)[data1]df[data1].groupby(df[key1])

两者达到的效果是相同的。

通过字典或者Series进行分组

假设已知一个DataFrame,并且知道abcde分别对应几种颜色,要求按照颜色分组,应该如何去做?


mapping = {a:red,b:red,c:blue,d:blue,e:red,f:orange}
其实,只要将字典传给groupby就可:
by_column = people.groupby(mapping,axis=1)
而Series也能:
map_series = Series(mapping)
而后把map_series传给groupby达到的效果是一样的。

通过函数进行分组

比方希望对上面的people按人名的长度分组,只要要传入len函数即可以了:people.groupby(len).sum()
而且函数能跟数组,列表,字典,Series这些混合使消耗,相当灵活。

根据索引级别分组

层次化索引数据集能通过level根据索引的级别聚合。


根据索引级别分组

数据聚合

当你自己构造了一个函数,并想消耗在groupby上时,能使消耗aggregate或者agg方法:grouped.agg(peak_to_peak)

少量方法

面向列的多函数应消耗

假如想对不同的列使消耗不同的聚合函数,或者一次应消耗多个函数。


一组函数

默认使消耗的列名标识性不是很好,能使消耗(name,function)元组组成的列表,则name会被作为列名了。如下:


(name,function)
对于DataFrame,你还能定义一组应消耗于一律列的函数,或者不同的列使消耗不同的函数。假设想要对tip_pct和total_bill列计算三个统计信息:
对多个列使消耗函数

另外,想对不同的列使消耗不同的函数(这是很常见的情况),需要往agg传入一个从列名映射到函数的字典:


不同的列使消耗不同的函数

以“无索引”的形式返回聚合数据

到目前为止.所有示例中的聚合数据都有由唯一的分组键组成的索引(可可以还是层次化的).因为并不总是需要如此,所以你能向groupby传入as_index=False以禁消耗该功可以:

tips.groupby([sex,smoker],as_index = False).mean()

总结

这节主要是对数据通过groupby进行分组,而后通过传入函数来返回聚合数据。

网友评论