在数据分析过程中,经常会需要根据某一列或多列把数据划分为不同的组别,然后再对其进行数据分析。本文将介绍pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。

在关系型数据库中我们常用SQL的GROUP BY操作进行分组分析计算。在pandas中要完成数据的分组操作同样可用groupby()函数,然后再在划分出来的组(group)上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换或者过滤。这个过程主要包含以下三步:拆分(split)-应用(apply)-合并(combine)
例如,DataFrame可以在列(axis=1)或行(axis=0)上进行分组(split),然后将一个函数应用(apply)到各个分组并产生一个新值,最后所有这些函数的执行结果会被合并(combine)到最终的结果对象中。
一个简单的分组聚合的过程如下图所示:

我们来构造图中所示的DataFrame数据集,看看pandas的分组聚合是怎么做的。

import pandas as pd
import numpy as np
df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
df

grouped=df.groupby(['key']) #通过key分组
#查看分组情况
for dtype,group in grouped:print(dtype)
grouped.sum() #对每个分组应用sum函数,并最后组合成结果


通过对df的key进行用groupby()进行分组,这里可看到,将数据分成了A、B、C三组,然后对这三组分别应用sum()函数求和,再组合成最终的结果。
对于分组聚合一般来说实际上是分两步:一是创建分组对象进行分组,二是对分组进行相应处理如(对组应用聚合函数、对组进行转换、对组的数据进行过滤)。不过实际在具体写的时候可以通过链式调用一个语句就可以实现如:

df.groupby(['key']).sum() #链式调用先分组再用聚合函数聚合

一、创建分组对象进行分组

groupby可以把分组时指定的键(key)作为每组的组名。groupby对象支持迭代,可以遍历每个分组的具体数据。
如:

#查看分组情况
for name,group in grouped:print(name)print(group)

1、根据多列进行分组

groupby可以通过传入需要分组的参数实现对数据的分组,参数可以是单列,也可以是多列,多列以列表的方式传入。

grouped=df.groupby(['key1','key2'])

2、通过字典或Series进行分组

除数组以外,分组信息还可以其他形式存在。如可以定义字典或Series进行分组。

people=pd.DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],index=['Joe','Steve','Wes','Jim','Bob'])
people
mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}#定义分组字典
by_column=people.groupby(mapping,axis=1)
#查看分组情况
for group_name,group_data in by_column:print(group_name)print(group_data)

在字典中我们定义了mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}#定义分组字典
a、b、e对应“red”,c、d对应“blue”所以将blue和red分成了两组。

应用sum()求和函数,可以看到分别对blue和red的分组进行了求和。
类似的,Series也是一样的,我们将map转换成Series,可以看到分组结果和map分组一样的。

3、通过函数进行分组

比起使用字典或Series,使用Python函数是一种更原生的方法定义分组映射,。任何被当做分组键的函数都会在各个索引值上被调用一次,其返回值就会被用作分组名称。
如上面的people数据集,将姓名索引的长度进行分组。

by_len=people.groupby(len)

可以看到将姓名长度相同的3分成一组,长度为5的数据分成了一组
更加通用的是可以自定义函数进行分组,如要将索引>5的和小于5的分别分组,可以自定义函数

#数据集
df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]},index=[1,2,3,4,5,6,7,8,9])
df
#自定义函数区分大于5和小于5的数据
def big5(x):  result=0if x>5:result=1return resultby_big5=df.groupby(big5)  #根据索引是否大于5进行分组
#查看分组情况
for group_name,group_data in by_big5:print(group_name)print(group_data)

二、对分组后的数据进行应用

前面通过分组将数据集根据条件分组后,可以对分组后的数据进行各种处理包括聚合、转换、过滤等操作。

1、对分组数据用聚合函数进行聚合

a) 使用pandas聚合函数

前面第一部分的例子中对数据分组后进行了sum()求和聚合操作,类似的聚合函数还有很多如:

函数名 描述
count 分组中非NA值的数量
sum 非NA值的和
mean 非NA值的平均值
median 非NA值的中位数
std, var 标准差和方差
min, max 非NA的最小值,最大值
prod 非NA值的乘积
first, last 非NA值的第一个,最后一个

b) 使用自定义聚合函数

pandas的groupby分组对象还可以用自定义的聚合函数可以通过groupby分组对象,将你自己的聚合函数,传入aggregate或agg方法即可

df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
df

grouped=df.groupby(['key'])
#查看分组情况
for group_name,group_data in grouped:print(group_name)print(group_data)

def peak_to_peak(arr):return arr.max() - arr.min()grouped.agg(peak_to_peak)

2、根据分组数据进行转换

根据分组数据进行数据转换或其他操作,可以在分组的基础上用apply函数进行数据的转换。
如数据集

df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
df
根据key分组
grouped=df.groupby(['key'])
#查看分组情况
for group_name,group_data in grouped:print(group_name)print(group_data)

现在我们要对data求和后小于25的分组数据都加1
那么我们可以定义函数,然后再对分数数据进行应用

def add1(df):if df[:]['data'].sum()<25:return df[:][['data']]+1else:return df[:][['data']]
grouped.apply(add1)

3、根据分组数据进行过滤

通过 filter() 函数可以实现数据的筛选,该函数根据定义的条件过滤数据并返回一个新的数据集。
如当我们要过滤掉分组后data求和小于25的数据

#过滤掉sum()求和小于25的数据
def filtersum25(x):if x['data'].sum()>25:return Trueelse:return False
grouped.filter(filtersum25)

至此,本文通过实例介绍了pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。数据的分组和聚合是数据分析中常用的分析手段,转换和过滤是数据处理中可用到的方法。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/

pandas数据分析之分组聚合相关推荐

  1. Pandas数据分析—groupby分组统计

    13.Pandas中groupby分组统计 文章目录 13.Pandas中groupby分组统计 前言 一.分组使用聚合函数做数据统计 1.准备数据 二.遍历groupby的结果理解执行流程 三.实例 ...

  2. Pandas数据处理_分组聚合_透视表交叉表

    1.分组聚合 1.1拆分数据 groupby方法的参数及其说明: #该方法提供的是分组聚合步骤中的拆分功能, #能根据索引或字段对数据进行分组.其常用参数与使用格式如下:DataFrame.group ...

  3. 最详细最直观的>>>理解Pandas分组聚合和透视图标

    写在前面: 突然打开excel看到透视图表, 瞬间理解了pandas中的分组聚合和透视图标的内容.分享给大家,希望给在学习路上的伙伴们少点疑虑. 分组聚合 首先, 创建我们需要的数据 df = pd. ...

  4. Pandas数据分析⑥——数据分析实例(货品送达率与合格率/返修率/拒收率)

    Pandas系列目录如下: Pandas数据分析①--数据读取(CSV/TXT/JSON) Pandas数据分析②--数据清洗(重复值/缺失值/异常值) Pandas数据分析③--数据规整1(索引和列 ...

  5. python数据分析及可视化(九)pandas数据规整(分组聚合、数据透视表、时间序列、数据分析流程)

    作业 拼接多个csv文件 去除重复数据,重新索引 自动挡和手动挡数目 计算每个城市二手车数量 统计每个汽车品牌平均售价价格(不是原价) 分组与聚合 如下表所示,5行3列的表格,5种水果分别对应的名称, ...

  6. 数据分析 第七讲 pandas练习 数据的合并、分组聚合、时间序列、pandas绘图

    文章目录 数据分析 第七讲 pandas练习 数据的合并和分组聚合 一.pandas-DataFrame 练习1 对于这一组电影数据,如果我们想runtime(电影时长)的分布情况,应该如何呈现数据? ...

  7. 数据分析三、pandas库 分组聚合与数据可视化

    分组聚合与数据可视化 一.分组聚合 1.1.单层分组聚合:df.groupby(by)['列索引'].mean(). 1.1.1单层分组:df.groupby(by) 1.1.2聚合操作:['列索引' ...

  8. 聚合多个文件_python数据分析与挖掘(二十五)--- Pandas高级处理分组与聚合

    分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况 想一想其实刚才的交叉表与透视表也有分组的功能,所以算是分组的一种形式,只不过他们主要是计算次数或者计算比例!!看其中 ...

  9. stream 多个字段分组_Python Pandas对Excel数据的分组聚合和数据透视

    使用Excel进行商业数据分析的时候,最重要的就是两个手段就是vlookup函数和数据透视表.本章就讲解一下与数据透视功能相关的分组聚合和数据透视.其实分组聚合和数据透视两者基本是等价的,但由于使用的 ...

  10. 利用pandas拆分单元格并进行分组聚合

    背景: 最近指导老师布置了一个数据分析的任务要将三张表格进行整理 得到错题的数目 页行列表示错题的位置 思路: 我的思路是读取文件夹当中的文件名列表,然后利用for循环和pandas逐一读取每个文件. ...

最新文章

  1. Kotlin 创建对象
  2. LeetCode 709 To Lower Case -- java,python解法
  3. 带你学习AOP框架之Aspect.Core[1]
  4. 在jsp页面如何禁用session?_Session 的简单介绍
  5. PDF文件的加载及展示
  6. 【转】Galileo伽利略项目-- 数字城市规划和基础设施建模
  7. 【转】文件各种上传,离不开的表单
  8. java表单单击路径_Form表单中的action路径问题,form表单action路径《jsp---Servlet路劲问题》这个和上一个《jsp---Servlet》文章有关...
  9. android横向纵向切换,【报Bug】安卓竖屏切换到横屏后,再切换回竖屏,不能正常还原...
  10. Hive 架构知识体系及语法详解
  11. SQL Server中的版本号
  12. C语言之“#“和“##“用法(十四)
  13. ant 发布web应用脚本
  14. 删除-驱动人生节能省电方案
  15. rand()和rand_r()的区别
  16. Linux 系统调用 fork wait exec
  17. 印度内阁小组讨论华为投资 通信部表示支持
  18. java解析excel合并单元格,100%好评!
  19. 中学化学教学参考杂志社中学化学教学参考编辑部2022年第15期目录
  20. 类变量,实例变量的区别以及类方法和实例方法的区别

热门文章

  1. 医院时钟系统(子母钟系统)构成及应用
  2. 背包客旅行札记-html
  3. Android下WPS打开Excel2007版也有问题
  4. 数据库系统概论(高级篇)
  5. CUDA学习笔记(三)——共享内存
  6. 异常与调试之SEH、UEH、VEH、VCH以及SEH的区别总结——简单好理解
  7. 关于铁路订票系统如何改善设计的讨论
  8. html中搜索框提示语,请输入您要搜索的内容(自定义Win10搜索框提示语的技巧)...
  9. C语言预处理指令-单片机必备技能
  10. 用 Python 进行多元线性回归分析(附代码)