我们经常需要对某些标签或索引的局部进行累计分析, 这时就需要用到 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('---------分割线----------')
特殊需求:
- 假如对于一列,我想要同时应用多个统计函数呢?
- 假如对于不同的列,我想要用不同的统计函数呢?
- 应用自定义函数进行统计
test = df.groupby('学历')
test.agg(['max','min','mean']) # 列表,同时统计多个统计值
test.agg({"测试成绩":['mean','std','var'], "产品评分":['max','min','mean']})
也可以应用自定义的统计函数进行统计。