pandas分组聚合详解
作者:知识追寻者 发布时间:2023-06-28 15:50:25
一 前言
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
来源:https://blog.csdn.net/youku1327/article/details/105397881
猜你喜欢
- Python 实现使用 dict 创建二维数据dict 的 keys、values 分别作为二维数据的两列In [16]: d = {1:&
- import timedef block(file,size=65536): while True:&n
- 今天接到一任务,有一张学生信息表(Excel表),里面有一万多条记录,现在要把这张表导入到数据库中,并设置学生学号为主键,但是现在这张表中的
- 这是一个第三方库,可以处理xlsx格式的Excel文件。pip install openpyxl安装。如果使用Aanconda,应该自带了。
- 本文讲述了php版微信公众账号第三方管理工具开发方法。分享给大家供大家参考,具体如下:最近在捣鼓微信公共平台提供的API,等确实一个获取用户
- 我想没多少人敢保证写JavaScript能不用调试,那选择用什么方式调试会比较好呢?告别了我最爱的alert("MM")
- 计算两个信号的交叉谱密度结果展示:完整代码:import numpy as npimport matplotlib.pyplot
- 一、torch.rand():构造均匀分布张量的方法torch.rand是用于生成均匀随机分布张量的函数,从区间[0,1)的均匀分布中随机抽
- 我看见朋友可以把数据库的记录输出到页面表格上去,觉得很有用。这是怎么做的啊?见下:dbtable.asp<html><he
- 本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下模块导入import numpy as npimport ga
- 上下文管理器是一种 Python 构造,它提供了一个类似 try-finally 的环境,具有一致的接口和方便的语法,例如通过&ld
- 什么是下载?首先客户端会问服务器,有没有一个xxx的文件啊?服务器开始寻找,找到后对客户端说有,然后客户端在本地新建一个文件,客户端从服务器
- 一。首先,添加如下存储过程CREATE PROCEDURE dbo.ChangeObjectOwner @Ol
- 在使用SQL Server 的过程中,由于经常需要从多个不同地点将数据集中起来或向多个地点复制数据,所以数据的导出,导入是极为常见的操作.我
- 通过购物车的一个案列,把vuex学习了一篇。vuex概念浅谈Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储
- 一、文件内容的分发 应用场景:分批读取共有358086行内容的txt文件,每取1000条输出到一个文件当中# coding=utf-8# 分
- 本文实例为大家分享了python实现桌面托盘气泡提示的具体代码,供大家参考,具体内容如下# -*- encoding:utf-8 -*- #
- YUI Compressor 压缩 JavaScript 的内容包括:移除注释移除额外的空格细微优化标识符替换(Identifier Rep
- 准备下载安装Python3官网下载即可,选择合适的版本:https://www.python.org/downloads/安装一直下一步即可
- 多表查询分类分类1:等值连接 vs 非等值连接1. 等值连接SELECT employees.employee_id, employees.