我们经常需要对某些标签或索引的局部进行累计分析, 这时就需要用到 groupby 了.

实际上,我们可以把 groupby 理解成一个分割(split),应用(apply),组合(combine)的过程.

 

一个经典分割-应用-组合操作如下图所示,其中应用的是一个求和函数.

  • 分割: 将 DataFrame按照指定的键分割成若干组
  • 应用: 对每个组应用函数, 通常是累计,转换或过滤函数
  • 组合: 将每一组的结果合并成一个输出组

在数据处理中, 我们经常需要把某些特征的共同值进行累计分析.

例如有一列特征, 储存的是用户学历数据, 分为, 初中, 高中, 大学

我们经常做的一件事情是, 将初中的, 高中, 大学的都各自分为一组, 然后统计每一组中的不同统计量的值.

df.groupby('学历') # by 以----进行分组

需要注意的是,这里的返回值不是一个 DataFrame 对象,而是一个 DataFrameGroupBy 对象。

你可以将它看成是一种特殊形式的 DataFrame,里面隐藏着若干组数据,但是在没有应用累计函数之前并不会真的计算。

我们在应用累计函数之后, 就会完成真正的计算。

df.groupby('学历').count()

df.groupby('学历').sum()

df.groupby('学历').mean()

……

1.筛选列

可以直接在groupby对象中选择列:

df.groupby('学历')['产品评分'].mean()

也可以统计后在选择列:

df.groupby('学历').mean()['产品评分']

2.可以通过遍历的方法, 将DataFrameGroupBy中的数据打印出来

for group_name,group_data in df.groupby('学历'):
    print(group_name)
    print("-------")
    print(group_data)
    print('---------分割线----------')

特殊需求:

  1. 假如对于一列,我想要同时应用多个统计函数呢?
  2. 假如对于不同的列,我想要用不同的统计函数呢?
  3. 应用自定义函数进行统计
test  = df.groupby('学历')
test.agg(['max','min','mean']) # 列表,同时统计多个统计值
test.agg({"测试成绩":['mean','std','var'], "产品评分":['max','min','mean']})

也可以应用自定义的统计函数进行统计。

02-12 08:48