Swift51.com
麦子学院 头像
麦子学院  2018-04-21 22:20

Python数据分析:分组运算与数据聚合

回复:0  查看:4387  

本文和大家分享的主要是通过groupby进行分组,然后通过传入函数来返回聚合数据相关内容,一起来看看吧,希望对大家学习python有所帮助。

  GroupBy技术

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

Python数据分析:分组运算与数据聚合


拆分-应用-合并

  比如对于一个DataFrame,想按key1分组,并计算data1列的平均值。一种简单的做法就是使用GroupBy

  grouped = df['data1'].groupby(df['key1'])

  grouped是一个GroupBy对象,只是按照要求,对dfkey1分组,取出了data1列的值。然后,我们就可以对 grouped.mean() 即可计算分组的平均值。 grouped.size() 会返回分组大小的Series

  对分组进行迭代

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

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

  print k1,k2

  print group

  k1,k2对应key1key2

Python数据分析:分组运算与数据聚合


迭代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分别对应几种颜色,要求按照颜色分组,应该如何去做?

Python数据分析:分组运算与数据聚合


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根据索引的级别聚合。

Python数据分析:分组运算与数据聚合


根据索引级别分组

  数据聚合

  当你自己构造了一个函数,并想用在groupby上时,可以使用aggregateagg方法grouped.agg(peak_to_peak)

Python数据分析:分组运算与数据聚合


一些方法

  面向列的多函数应用

  如果想对不同的列使用不同的聚合函数,或一次应用多个函数。

Python数据分析:分组运算与数据聚合


一组函数

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

Python数据分析:分组运算与数据聚合


(name,function)

  对于DataFrame,你还可以定义一组应用于全部列的函数,或不同的列使用不同的函数。假设想要对tip_pcttotal_bill列计算三个统计信息:

Python数据分析:分组运算与数据聚合


对多个列使用函数

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

Python数据分析:分组运算与数据聚合


不同的列使用不同的函数

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

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

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

Python数据分析:分组运算与数据聚合

来源:网络