Python DataFrame.groupby()聚合函数,分组级运算


Posted in Python onSeptember 18, 2018

pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象。计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。对DataFrame的列应用各种各样的函数。应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。计算透视表或交叉表。执行分位数分析以及其他分组分析。

groupby分组函数:

返回值:返回重构格式的DataFrame,特别注意,groupby里面的字段内的数据重构后都会变成索引

groupby(),一般和sum()、mean()一起使用,如下例:

先自定义生成数组

import pandas as pd
df = pd.DataFrame({'key1':list('ababa'),
  'key2': ['one','two','one','two','one'],
  'data1': np.random.randn(5),
  'data2': np.random.randn(5)})
print(df)

 data1 data2 key1 key2
0 -1.313101 -0.453361 a one
1 0.791463 1.096693 b two
2 0.462611 1.150597 a one
3 -0.216121 1.381333 b two
4 0.077367 -0.282876 a one

应用groupby,分组键均为Series(譬如df[‘xx']),实际上分组键可以是任何长度适当的数组

#将df['data1']按照分组键为df['key1']进行分组
grouped=df['data1'].groupby(df['key1'])
print(grouped.mean())
key1
a -0.257707
b 0.287671
Name: data1, dtype: float64
states=np.array(['Ohio','California','California','Ohio','Ohio'])
years=np.array([2005,2005,2006,2005,2006])
#states第一层索引,years第二层分层索引
print(df['data1'].groupby([states,years]).mean())
California 2005 0.791463
 2006 0.462611
Ohio 2005 -0.764611
 2006 0.077367
Name: data1, dtype: float64
#df根据‘key1'分组,然后对df剩余数值型的数据运算
df.groupby('key1').mean()
 data1 data2
key1  
a -0.257707 0.138120
b 0.287671 1.239013
#可以看出没有key2列,因为df[‘key2']不是数值数据,所以被从结果中移除。默认情况下,所有数值列都会被聚合,虽然有时可能被过滤为一个子集。

对分组进行迭代

#name就是groupby中的key1的值,group就是要输出的内容
for name, group in df.groupby('key1'):
 print (name,group)
a data1 data2 key1 key2
0 -1.313101 -0.453361 a one
2 0.462611 1.150597 a one
4 0.077367 -0.282876 a one
b data1 data2 key1 key2
1 0.791463 1.096693 b two
3 -0.216121 1.381333 b two

对group by后的内容进行操作,可转换成字典

#转化为字典
piece=dict(list(df.groupby('key1')))
{'a': data1 data2 key1 key2
 0 -1.313101 -0.453361 a one
 2 0.462611 1.150597 a one
 4 0.077367 -0.282876 a one, 'b': data1 data2 key1 key2
 1 0.791463 1.096693 b two
 3 -0.216121 1.381333 b two}
#对字典取值
value = piece['a']

groupby默认是在axis=0上进行分组的,通过设置也可以在其他任何轴上进行分组

grouped=df.groupby(df.dtypes, axis=1)
value = dict(list(grouped))
print(value)
{dtype('float64'): data1 data2
0 -1.313101 -0.453361
1 0.791463 1.096693
2 0.462611 1.150597
3 -0.216121 1.381333
4 0.077367 -0.282876, dtype('O'): key1 key2
0 a one
1 b two
2 a one
3 b two
4 a one}

对于大数据,很多情况是只需要对部分列进行聚合

#对df进行'key1','key2'的两次分组,然后取data2的数据,对两次细分的分组数据取均值
value = df.groupby(['key1','key2'])[['data2']].mean()
 data2
key1 key2 
a one 0.138120
b two 1.239013
----------------------------------
df
Out[1]: 
 data1 data2 key1 key2
0 -1.313101 -0.453361 a one
1 0.791463 1.096693 b two
2 0.462611 1.150597 a one
3 -0.216121 1.381333 b two
4 0.077367 -0.282876 a one
----------------------------------
df['key2'].iloc[-1] ='two'
value = df.groupby(['key1','key2'])[['data2']].mean()
value
Out[2]: 
 data2
key1 key2 
a one 0.348618
 two -0.282876
b two 1.239013

Python中的分组函数(groupby、itertools)

from operator import itemgetter #itemgetter用来去dict中的key,省去了使用lambda函数
from itertools import groupby #itertool还包含有其他很多函数,比如将多个list联合起来。。
d1={'name':'zhangsan','age':20,'country':'China'}
d2={'name':'wangwu','age':19,'country':'USA'}
d3={'name':'lisi','age':22,'country':'JP'}
d4={'name':'zhaoliu','age':22,'country':'USA'}
d5={'name':'pengqi','age':22,'country':'USA'}
d6={'name':'lijiu','age':22,'country':'China'}
lst=[d1,d2,d3,d4,d5,d6]
#通过country进行分组:
lst.sort(key=itemgetter('country')) #需要先排序,然后才能groupby。lst排序后自身被改变
lstg = groupby(lst,itemgetter('country')) 
#lstg = groupby(lst,key=lambda x:x['country']) 等同于使用itemgetter()
for key,group in lstg:
 for g in group: #group是一个迭代器,包含了所有的分组列表
 print key,g
返回:
China {'country': 'China', 'age': 20, 'name': 'zhangsan'}
China {'country': 'China', 'age': 22, 'name': 'lijiu'}
JP {'country': 'JP', 'age': 22, 'name': 'lisi'}
USA {'country': 'USA', 'age': 19, 'name': 'wangwu'}
USA {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}
USA {'country': 'USA', 'age': 22, 'name': 'pengqi'}
print [key for key,group in lstg] #返回:['China', 'JP', 'USA']
print [(key,list(group)) for key,group in lstg]
#返回的list中包含着三个元组:
[('China', [{'country': 'China', 'age': 20, 'name': 'zhangsan'}, {'country': 'China', 'age': 22, 'name': 'lijiu'}]), ('JP', [{'country': 'JP', 'age': 22, 'name': 'lisi'}]), ('USA', [{'country': 'USA', 'age': 19, 'name': 'wangwu'}, {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}, {'country': 'USA', 'age': 22, 'name': 'pengqi'}])]
print dict([(key,list(group)) for key,group in lstg])
#返回的是一个字典:
{'JP': [{'country': 'JP', 'age': 22, 'name': 'lisi'}], 'China': [{'country': 'China', 'age': 20, 'name': 'zhangsan'}, {'country': 'China', 'age': 22, 'name': 'lijiu'}], 'USA': [{'country': 'USA', 'age': 19, 'name': 'wangwu'}, {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}, {'country': 'USA', 'age': 22, 'name': 'pengqi'}]}
print dict([(key,len(list(group))) for key,group in lstg])
#返回每个分组的个数:
{'JP': 1, 'China': 2, 'USA': 3}
#返回包含有2个以上元素的分组
print [key for key,group in groupby(sorted(lst,key=itemgetter('country')),itemgetter('country')) if len(list(group))>=2]
#返回:['China', 'USA']
 
lstg = groupby(sorted(lst,key=itemgetter('country')),key=itemgetter('country')) 
lstgall=[(key,list(group)) for key,group in lstg ]
print dict(filter(lambda x:len(x[1])>2,lstgall)) 
#过滤出分组后的元素个数大于2个的分组,返回:
{'USA': [{'country': 'USA', 'age': 19, 'name': 'wangwu'}, {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}, {'country': 'USA', 'age': 22, 'name': 'pengqi'}]}

自定义分组:

from itertools import groupby
lst=[2,8,11,25,43,6,9,29,51,66]

def gb(num):
 if num <= 10:
 return 'less'
 elif num >=30:
 return 'great'
 else:
 return 'middle'
print [(k,list(g))for k,g in groupby(sorted(lst),key=gb)]
返回:
[('less', [2, 6, 8, 9]), ('middle', [11, 25, 29]), ('great', [43, 51, 66])]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python和C/C++交互的几种方法总结
May 11 Python
pandas 选择某几列的方法
Jul 03 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
利用anaconda作为python的依赖库管理方法
Aug 13 Python
python进阶之自定义可迭代的类
Aug 20 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
django修改models重建数据库的操作
Mar 31 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Python unittest discover批量执行代码实例
Sep 08 Python
python boto和boto3操作bucket的示例
Oct 30 Python
python Protobuf定义消息类型知识点讲解
Mar 02 Python
python 3.6.2 安装配置方法图文教程
Sep 18 #Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 #Python
python 3.6.4 安装配置方法图文教程
Sep 18 #Python
python 3.6.5 安装配置方法图文教程
Sep 18 #Python
python的pip安装以及使用教程
Sep 18 #Python
windows下python安装小白入门教程
Sep 18 #Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 #Python
You might like
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
php中yii框架实例用法
2020/12/22 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
jQuery 解析xml文件
2009/08/09 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
对Python中type打开文件的方式介绍
2018/04/28 Python
Python自定义一个异常类的方法
2019/06/27 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
基于matplotlib xticks用法详解
2020/04/16 Python
使用Python pip怎么升级pip
2020/08/11 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
实习教师个人的自我评价
2013/11/08 职场文书
七匹狼男装广告词
2014/03/21 职场文书
大学生就业求职信
2014/06/12 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS