前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas分组聚合详解

pandas分组聚合详解

作者头像
砸漏
发布2020-11-04 10:31:36
1.2K1
发布2020-11-04 10:31:36
举报
文章被收录于专栏:恩蓝脚本

一 前言

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

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

二 分组

2.1 数据准备

代码语言:javascript
复制
# -*- 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列进行分组,最后对分好组的数据进行处理求均值;

代码语言:javascript
复制
# 是个生成器
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后面使用列表指定,并且调用求均值函数;输出的值将是分组列,均值结果;

代码语言:javascript
复制
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进行分组,则不再需要提取指定的列;

代码语言:javascript
复制
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()函数统计个数;此方法常用的统计技巧;

代码语言:javascript
复制
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是分组的数据;

代码语言:javascript
复制
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可以是任何不重复的变量名称

代码语言:javascript
复制
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 分组数据转为字典

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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;

代码语言:javascript
复制
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

代码语言:javascript
复制
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的分组列

代码语言:javascript
复制
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 通过索引层级分组

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

代码语言:javascript
复制
# 创建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 分组聚合内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档