pandas分组聚合详解
本文详细解析pandas库中的分组聚合操作。通过实际代码示例,演示如何根据单列或多列对DataFrame进行分组,计算均值、统计数量,并介绍分组迭代、转换为字典及Series作为分组键的高级用法。内容涵盖层级索引分组,帮助开发者掌握高效数据处理技巧。
pandas分组聚合详解
一 前言
当学习到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
分组取值与Series分组
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 分组聚合内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













