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的Urllib库的一些高级用法
Apr 30 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
tensorflow获取变量维度信息
Mar 10 Python
TensorFLow用Saver保存和恢复变量
Mar 10 Python
python实现淘宝秒杀脚本
Jun 23 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Python实现使用request模块下载图片demo示例
May 24 Python
12个步骤教你理解Python装饰器
Jul 01 Python
Django 对IP访问频率进行限制的例子
Aug 30 Python
详解Python self 参数
Aug 30 Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 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
用PHP读取IMAP邮件
2006/10/09 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
原生js实现分页效果
2020/09/23 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
Python 异常处理实例详解
2014/03/12 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
什么是抽象
2015/12/13 面试题
家长通知书教师评语
2014/04/17 职场文书
学生手册评语
2014/05/05 职场文书
四年级小学生评语
2014/12/26 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
首次购房证明
2015/06/19 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL