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之玩转字符串(1)
Sep 14 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
Python脚本实现自动发带图的微博
Apr 27 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
Python操作redis和mongoDB的方法
Dec 19 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 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
在JavaScript中调用php程序
2009/03/09 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
layui表格实现代码
2017/05/20 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
公司活动策划方案
2014/01/13 职场文书
委托函范文
2015/01/29 职场文书
预备党员个人总结
2015/02/14 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
开场白怎么写
2015/06/01 职场文书
2019毕业论文致谢词
2019/06/24 职场文书