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中操作时间之tzset()方法的使用教程
May 22 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
python paramiko模块学习分享
Aug 23 Python
Python自定义简单图轴简单实例
Jan 08 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python实现汇率转换操作
May 03 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
深入浅析Python代码规范性检测
Jul 31 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
DC动漫人物排行
2020/03/03 欧美动漫
mysql+php分页类(已测)
2008/03/31 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
js中split函数的使用方法说明
2013/12/26 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
python 实现UTC时间加减的方法
2018/12/31 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
简单了解Django ContentType内置组件
2019/07/23 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
应届生自荐书
2014/06/23 职场文书
大学生创业计划书
2014/08/14 职场文书
政府四风问题整改措施
2014/10/04 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
房屋买卖协议样本
2014/11/16 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
公司员工手册范本
2015/05/14 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
MSSQL基本语法操作
2022/04/11 SQL Server
V Rising 服务器搭建图文教程
2022/06/16 Servers