1、概述

1.1 group语法

df.groupby(self, by=None, axis=0, level=None,
as_index: bool=True, sort: bool=True,
group_keys: bool=True,
squeeze: bool=False,
observed: bool=False, dropna=True)

其中 by 为分组字段,由于是第一个参数可以省略,可以按列表给多个。会返回一个groupby_generic.DataFrameGroupBy对象,如果不给定聚合方法,不会返回 DataFrame。

1.2 DateFrame应用分组

  #按team进行分组,并求和
df.groupby('team').sum()

  #对不同列进行不同的聚合计算,对分组对象使用agg,传入函数字典
#对分组后的同一列进行不同运算 df.groupby('team').agg({'Q1':['sum','max'],'Q2':['count','mean']})

1.3 Series应用分组

如果给groupby的by参数传入一个Series,此series与分组数据的索引对齐后,按series的值进行分组

  df.groupby(by=df.team).sum()

  df.Q1.groupby(df.team).sum()

2、分组

df.groupby()会生成一个分组对象,把这个对象的各个字段按照一定的聚合方法输出

下面介绍,分组对象 and 分组对象的方法有哪些

2.1 分组对象

2.2 按标签分组

按某一列/多列进行分组

如果是多列,会按照这几个列的排列组合的去重,进行分组,并且get_group()时要传入元组

  grouped = df.groupby('team')
grouped.get_group('A')

  grouped = df.groupby(['team','name'])
grouped.get_group(('A','Ack'))

2.3 表达式

将数据分为ture 和 false两组

  grouped = df.groupby(lambda x: x>60)
grouped.sum()

  df.groupby(lambda x: 'Q' in x,axis=1).sum() #按列名是否包含字母Q,分成两列 ‘name’和‘team’不包含被分到了一起

  # 按索引的奇偶行分组
df.groupby(df.index%2==0).sum()

2.4 函数分组

:satr:by参数可以调用一个函数,通过函数计算返回一个分组依据

  #按姓名首字母为元音or辅音分组

  def first_letter(name):
if name[0].lower() in 'aeiou':
return 'yuan yin'
return 'fu yin' df.set_index('name').groupby(first_letter).sum()

2.5 多种方法混合

by参数传一个list

df.groupby(['team',df.name.apply(first_letter)]).sum()

3、分组对象操作

3.1 选择分组

3.2 迭代分组

  for name, item in grouped:
print(name)
print(item)

3.3 选择列

  #选择分组后各组的某一列,像df那样选择即可
grouped.Q1.sum()

  #选择多列
grouped['Q1','Q2'].sum()

3.4 应用函数apply

分组对象调用apply,是传入一个df,返回经过函数计算后的df,s,或者标量,再把数据组合

  #将Q1的数据*2
grouped.apply(lambda x:x.Q1*2)
'''
```
team
A 2 114
7 18
9 154
16 126
17 182
...
E 80 184
82 8
90 76
98 22
99 42
Name: Q1, Length: 100, dtype: int64
```
''' #见分组中的一列输出为列表
grouped.apply(lambda x:x.Q1.to_list()) '''
```
team
A [57, 9, 77, 63, 91, 60, 44, 30, 52, 86, 28, 64...
B [61, 17, 9, 80, 89, 57, 9, 97, 2, 66, 18, 21, ...
C [36, 93, 24, 83, 51, 80, 50, 91, 90, 1, 29, 69...
D [65, 64, 79, 80, 62, 15, 24, 57, 50, 79, 5, 14...
E [89, 48, 97, 74, 71, 35, 67, 88, 48, 8, 8, 12,...
dtype: object
```
''' #实现每组成绩前三 def get_head(df):
df['sum']=df.sum(1)
df = df.sort_values('sum',ascending = False)
return df.head(3) df.set_index('name').groupby('team').apply(get_head)

  #传入一个series,隐射系列不同的聚合统计方法
def f_mi(x):
d = []
d.append(x['Q1'].sum())
d.append(x['Q2'].max())
d.append(x['Q3'].mean())
d.append(x['Q4']*x['Q4'].sum())
return pd.Series(d,index=[['Q1','Q2','Q3','Q4'],['sum','max','mean','prodsum']])
df.groupby('team').apply(f_mi)

3.5 管道方法pipe

类似于df的管道方法

将同组的所有数据应用在方法中,返回的是经过函数处理的返回数据格式

  #每组最大值和最小值之和

  grouped.pipe(lambda x:x.max()+x.min())

  #下面使用自定义函数,经过计算,返回一个Series

  #A/B组平均值的差值

  def get_mean(df):
return df.get_group('A').mean()-df.get_group('B').mean() grouped.pipe(get_mean) '''
```
Q1 18.387701
Q2 -17.775401
Q3 -3.165775
Q4 -5.577540
dtype: float64
```
'''

3.6 转换方法transform

:satr:transform()类似于agg,但transform会返回与原始数据相同形状的DateFrame

  • 会将原来数据的值一一替换成统计后的值

例如:按组计算平均成绩,那么返回的新的df中每个学生的成绩就是它所在组的平均成绩

  #将所有数据替换成分组中的平均成绩
grouped.transform('mean')

  #可以用它进行按组筛选
#Q1成绩大于60的组的所有成员 df[grouped.transform('mean').Q1>60]

3.7 筛选方法filter

使用filter()对组作为整体进行筛选,满足条件,整个组会被显示 传入它调用的函数的默认变量是每个分组的DateFrame,经过计算,最终返回一个布尔值,为真的DateFrame全部显示

  #按团队分组,每组的每个季度成绩为本季度的的平均分
#全年的成绩为这个季度的平均分的平均费
#最终筛选出团队中分数高于51的所有成员 def get_score(df):
score = 51
return df.mean().mean() > score df.groupby('team').filter(get_score)

  # Q1成绩至少有一个大于97的组
grouped.filter(lambda x:(x.Q1>97).any())

  #所有成员平均成绩大于60的组

  grouped.filter(lambda x: (x.mean()>30).all())

4、参考文献

《深入浅出Pandas》

Pandas 分组聚合 :分组、分组对象操作的更多相关文章

  1. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  2. pandas聚合和分组运算——GroupBy技术(1)

    数据聚合与分组运算——GroupBy技术(1),有需要的朋友可以参考下. pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个 ...

  3. Pandas系列(九)-分组聚合详解

    目录 1. 将对象分割成组 1.1 关闭排序 1.2 选择列 1.3 遍历分组 1.4 选择一个组 2. 聚合 2.1 一次应用多个聚合操作 2.2 对DataFrame列应用不同的聚合操作 3. t ...

  4. Pandas 分组聚合

    # 导入相关库 import numpy as np import pandas as pd 创建数据 index = pd.Index(data=["Tom", "Bo ...

  5. 利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)

    对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节.在将数据集加载.融合.准备好之后,通常是计算分组统计或生成透视表.pandas提供了一个灵活高效的group ...

  6. pandas聚合和分组运算之groupby

    pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个键(可以是函数.数组或DataFrame列名)拆分pandas对象.计算分 ...

  7. Pandas时间序列和分组聚合

    #时间序列import pandas as pd import numpy as np # 生成一段时间范围 ''' 该函数主要用于生成一个固定频率的时间索引,在调用构造方法时,必须指定start.e ...

  8. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  9. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

随机推荐

  1. [FireshellCTF2020]ScreenShooter 1

    此题关键在于理清逻辑,本地将url发送给服务器,服务器请求sereenshooter以后将结果返回 所以应该在服务器查看日志. 发现了PhantomJS 引擎一下 <!DOCTYPE html& ...

  2. js select 删除某一项下拉列表的值

    <script type="text/javascript"> //muqingwei modify 通过群组类别选择需要的的群组 var mySelect = doc ...

  3. Python计算身体质量指数BMI

    使用Python计算身体质量指数BMI 运行结果如下: 源代码: 1 ''' 2 3. 利用函数思想,将"身体质量指数BMI"源程序封装成为一个函数并调用. 3 :param he ...

  4. Exchange批量删除邮件

    在实际工作中经常遇到以下问题:邮件发送给错误的收件人,简而言之就是邮件发错了,如果遇到群发更麻烦.Exchange中提供了批量删除邮件功能,当用户发现发送错误后,管理员可以检索并删除指定的邮件. 案例 ...

  5. Blazor 国际化多语言界面 (I18nText )

    在实际使用中,我们经常会遇到需要把程序界面多种语言切换,适应不同地区使用者的需求,本文介绍一个我初学Blazor接触到的库,边撸边讲解. 包名: Toolbelt.Blazor.I18nText ht ...

  6. Blazor组件提交全记录: FullScreen 全屏按钮/全屏服务 (BootstrapBlazor - Bootstrap 风格的 Blazor UI 组件库)

    Blazor 简介 Blazor 是一个使用 .NET 生成的交互式客户端 Web UI 的框架.和前端同学所熟知的 Vue.React.Angular 有巨大差异. 其最大的特色是使用 C# 代码( ...

  7. 时间篇之centos6下修复的ntp操作(ntpd和ntpdate两个服务区别)

    系统采样,本采样和命令都是在centos6.4的系统中进行 主要比较centos7和centos6之间的差异,因为大部分都开始采用centos7但是有些老系统还采用centos6,这样我们就需要熟悉c ...

  8. Solon 1.6.36 发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  9. 记一次mysql请求超时甩锅历程

    今天下午业务找我说是线上环境一个mysql库很慢,请求出现了大量的超时,让帮忙看看,以下为查找过程及甩锅过程. 1. mysql请求超时,ok,我们所有线上mysql都是开启了慢查询日志的,查找慢查询 ...

  10. zookeeper篇-初识zookeeper

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 什么是zookeeper? 中间件 作用于分布式系统 支持java.c语 ...