pandas分组聚合详解


Posted in Python onApril 10, 2020

一 前言

pandas学到分组迭代,那么基础的pandas系列就学的差不多了,自我感觉不错,知识追寻者用pandas处理过一些数据,蛮好用的;

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 分组

2.1 数据准备

# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

frame = pd.DataFrame({
 'user' : ['zszxz','craler','rose','zszxz','rose'],
 'hobby' : ['reading','running','hiking','reading','hiking'],
 'price' : np.random.randn(5),
 'number' : np.random.randn(5)
})
print(frame)

输出

     user    hobby     price    number
0   zszxz  reading  0.275752 -0.075841
1  craler  running -1.410682  0.259869
2    rose   hiking -0.353269 -0.392659
3   zszxz  reading  1.484604  0.659274
4    rose   hiking -1.348315  2.492047

2.2 分组求均值

提取DataFrame中price 列,根据hobby列进行分组,最后对分好组的数据进行处理求均值;

# 是个生成器
group = frame['price'].groupby(frame['hobby'])
# 求均值
print(group.mean())

输出

hobby
hiking    -0.850792
reading    0.880178
running   -1.410682
Name: price, dtype: float64

Tip: 可以理解为 根据爱好分组,查询价格;查询的列必须是数字,否则求均值时会报异常

如果是根据多列分组则在groupby后面使用列表指定,并且调用求均值函数;输出的值将是分组列,均值结果;

group = frame['price'].groupby([frame['hobby'],frame['user']])
print(group.mean())

输出

hobby    user 
hiking   rose      0.063972
reading  zszxz     0.393164
running  craler   -1.395186
Name: price, dtype: float64

如果对整个DataFrame进行分组,则不再需要提取指定的列;

group = frame.groupby(frame['hobby'])
print(group.mean())

输出

hobby                     
hiking  -0.116659 -0.316222
reading -0.651365  0.856299
running -0.282676 -0.585124

Tip: 求均值后,默认是对数字类型的数据进行分组求均值;非数字列自动忽略

2.3 分组求数量

分组求数量是统计分析中应用最为广泛的函数;如下示例中对DataFrame根据hobby分组,并且调用 size()函数统计个数;此方法常用的统计技巧;

group = frame.groupby(frame['hobby'])
print(group.size())

输出

hobby
hiking     2
reading    2
running    1
dtype: int64

2.4 分组迭代

当对groupby的列只有单个时(示例根据hobby进行分组),可以 使用 key , value 形式 对分组后的数据进行迭代,其中key 是分组的名称,value是分组的数据;

group = frame['price'].groupby(frame['hobby'])
for key , data in group:
 print(key)
 print(data)

输出

hiking
2   -0.669410
4   -0.246816
Name: price, dtype: float64
reading
0    1.362191
3   -0.052538
Name: price, dtype: float64
running
1    0.8963
Name: price, dtype: float64

当对多个列进行分组迭代时,有多少列则需要指定多少个key与其对应,key可以是任何不重复的变量名称

group = frame['price'].groupby([frame['hobby'],frame['user']])
for (key1, key2) , data in group:
 print(key1,key2)
 print(data)

输出

hiking rose
2   -0.019423
4   -2.642912
Name: price, dtype: float64
reading zszxz
0    0.405016
3    0.422182
Name: price, dtype: float64
running craler
1   -0.724752
Name: price, dtype: float64

2.5 分组数据转为字典

可以对分组后的数据转为字典;

dic = dict(list(frame.groupby(frame['hobby'])))
print(dic)

输出

{'hiking':    user   hobby     price    number
2  rose  hiking  0.351633  0.523272
4  rose  hiking  0.800039  0.331646,
'reading':     user    hobby     price    number
0  zszxz  reading -0.074857 -0.928798
3  zszxz  reading  0.666925  0.606706,
'running':      user    hobby     price    number
1  craler  running -2.525633  0.895776}

获取key

print(dic['hiking'])

输出

   user   hobby     price    number
2  rose  hiking  0.382225 -0.242055
4  rose  hiking  1.055785 -0.328943

2.6 分组取值

对frame进行hobby分组,就算查询 price 的均值;返回Series;

mean = frame.groupby('hobby')['price'].mean()
print(type(mean))
print(mean)

输出

<class 'pandas.core.series.Series'>
hobby
hiking     0.973211
reading   -1.393790
running   -0.286236
Name: price, dtype: float64

Tip: frame.groupby(‘hobby')[‘price'] 与 frame[‘price'] .groupby(frame[‘hobby']) 相等

如果想要返回 DataFrame

mean = frame.groupby('hobby')[['price']].mean()
print(type(mean))
print(mean)

输出

<class 'pandas.core.frame.DataFrame'>
            price
hobby           
hiking   0.973211
reading -1.393790
running -0.286236

2.5 Series作为分组

也可以传入Series作为DataFrame的分组列

ser = pd.Series(['hiking','reading','running'])
data = frame.groupby(ser).mean()
print(data)

输出

            price    number
hiking   1.233396  0.313839
reading -0.298887  0.982853
running -0.797734 -1.230811

Tip: 本质上都是数组,除了Series,还可以使用字典,列表,数组,函数作为分组列

2.6 通过索引层级分组

传入级别的名称即可实现层级化索引分组

# 创建2个列,并且指定名称
columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],
          ['a', 'b', 'a', 'b', 'c']], names=['language', 'alpha'])
frame = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
print(frame)

# 根据language进行分组
print(frame.groupby(level='language', axis=1).sum())
# 根据index进行分组
print(frame.groupby(level='alpha', axis=1).sum())

frame输出如下

language Python Java Python Java Python
alpha         a    b      a    b      c
0             9    9      7    4      5
1             3    4      7    6      6
2             6    6      3    9      1
3             1    1      8    5      2
4             6    5      9    5      4

language分组如下

language  Java  Python
0           13      21
1           10      16
2           15      10
3            6      11
4           10      19

alpha分组如下

alpha   a   b  c
0      16  13  5
1      10  10  6
2       9  15  1
3       9   6  2
4      15  10  4

 到此这篇关于pandas分组聚合详解的文章就介绍到这了,更多相关pandas 分组聚合内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
python3+selenium自动化测试框架详解
Mar 17 Python
Python比较配置文件的方法实例详解
Jun 06 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
详解Pymongo常用查询方法总结
Jan 29 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 Python
基于Python编写一个监控CPU的应用系统
Jun 25 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 #Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 #Python
Selenium基于PIL实现拼接滚动截图
Apr 10 #Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 #Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 #Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 #Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 #Python
You might like
PHP5 字符串处理函数大全
2010/03/23 PHP
360通用php防护代码(使用操作详解)
2013/06/18 PHP
php curl模拟post请求小实例
2013/11/13 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
python获取一组汉字拼音首字母的方法
2015/07/01 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
python求前n个阶乘的和实例
2020/04/02 Python
Python是怎样处理json模块的
2020/07/16 Python
顺丰快递Java软件工程师面试题
2015/07/31 面试题
计算机工程学院个人求职信
2013/10/05 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
培训班开班主持词
2015/07/02 职场文书
导游词之上饶龟峰
2019/10/25 职场文书