前言
在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别进行分组来进行分析,这时通过pandas下的groupby()函数就可以解决。在使用pandas进行数据分析时,groupby()函数将会是一个数据分析辅助的利器。
groupby的作用可以参考 超好用的 pandas 之 groupby 中作者的插图进行直观的理解:
准备
读入的数据是一段学生信息的数据,下面将以这个数据为例进行整理grouby()
函数的使用:
import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv('./data.csv') print(df)
Name Gender Age Score 0 Alen Male 18 80 1 Bob Male 19 90 2 Cidy Female 18 93 3 Daniel Male 20 87 4 Ellen Female 17 96 5 Frankie Male 21 100 6 Gate Male 20 88 7 Hebe Female 22 98
基本操作
在进行对groupby
函数进行学习之前,首先需要明确的是,通过对DataFrame
对象调用groupby()
函数返回的结果是一个DataFrameGroupBy
对象,而不是一个DataFrame
或者Series
对象,所以,它们中的一些方法或者函数是无法直接调用的,需要按照GroupBy
对象中具有的函数和方法进行调用。
grouped = df.groupby('Gender') print(type(grouped)) print(grouped) <class 'pandas.core.groupby.groupby.DataFrameGroupBy'>
分组时,不仅仅可以指定一个列名,也可以指定多个列名:
grouped = df.groupby('Gender') grouped_muti = df.groupby(['Gender', 'Age']) print(grouped.size()) print(grouped_muti.size()) Gender Female 3 Male 5 dtype: int64 Gender Age Female 17 1 18 1 22 1 Male 18 1 19 1 20 2 21 1 dtype: int64
指定多个列名个单个列名后的区别在于,分组的主键或者索引(indice)将一个是单个主键,另一个则是一个元组的形式:
print(grouped.get_group('Female')) print(grouped_muti.get_group(('Female', 17))) Name Gender Age Score 2 Cidy Female 18 93 4 Ellen Female 17 96 7 Hebe Female 22 98 Name Gender Age Score 4 Ellen Female 17 96
通过调用get_group()
函数可以返回一个按照分组得到的DataFrame
对象,所以接下来的使用就可以按照·DataFrame·对象来使用。如果想让这个DataFrame
对象的索引重新定义可以通过:
df = grouped.get_group('Female').reset_index() print(df) index Name Gender Age Score 0 2 Cidy Female 18 93 1 4 Ellen Female 17 96 2 7 Hebe Female 22 98
这里可以总结一下,由于通过groupby()
函数分组得到的是一个DataFrameGroupBy
对象,而通过对这个对象调用get_group()
,返回的则是一个·DataFrame·对象,所以可以将DataFrameGroupBy
对象理解为是多个DataFrame
组成的。
而没有调用get_group()
函数之前,此时的数据结构任然是DataFrameGroupBy
,此时进行对DataFrameGroupBy
按照列名进行索引,同理就可以得到SeriesGroupBy
对象,取多个列名,则得到的任然是DataFrameGroupBy
对象,这里可以类比DataFrame
和Series
的关系。
按照上面的思路理解后,再调用get_group()
函数后得到的DataFrame
对象按照列名进行索引实际上就是得到了Series
的对象,下面的操作就可以按照Series
对象中的函数行了。
在没有进行调用get_group()
,也就是没有取出特定某一组数据之前,此时的数据结构任然是DataFrameGroupBy
,其中也有很多函数和方法可以调用,如max()
、count()
、std()
等,返回的结果是一个DataFrame
对象。
print(grouped.count()) print(grouped.max()[['Age', 'Score']]) print(grouped.mean()[['Age', 'Score']]) Name Age Score Gender Female 3 3 3 Male 5 5 5 Age Score Gender Female 22 98 Male 21 100 Age Score Gender Female 19.0 95.666667 Male 19.6 89.000000
如果其中的函数无法满足你的需求,你也可以选择使用聚合函数aggregate
,传递numpy
或者自定义的函数,前提是返回一个聚合值。
def getSum(data): total = 0 for d in data: total+=d return total print(grouped.aggregate(np.median)) print(grouped.aggregate({'Age':np.median, 'Score':np.sum})) print(grouped.aggregate({'Age':getSum}))
aggregate
函数不同于apply
,前者是对所有的数值进行一个聚合的操作,而后者则是对每个数值进行单独的一个操作:
def addOne(data): return data + 1 df['Age'] = df['Age'].apply(addOne) df['Age'] = df['Age'].apply(int)
可视化操作
对组内的数据绘制概率密度分布:
grouped['Age'].plot(kind='kde', legend=True) plt.show()
由于grouped['Age']
是一个SeriesGroupby
对象, 顾名思义, 就是每一个组都有一个Series
. 所以直接plot相当于遍历了每一个组内的Age数据。
REF
groupby官方文档
超好用的 pandas 之 groupby
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 魔兽世界奥卡兹岛地牢入口在哪里 奥卡兹岛地牢入口位置一览
- 和文军-丽江礼物[2007]FLAC
- 陈随意2012-今生的伴[豪记][WAV+CUE]
- 罗百吉.2018-我们都一样【乾坤唱片】【WAV+CUE】
- 《怪物猎人:荒野》不加中配请愿书引热议:跪久站不起来了?
- 《龙腾世纪4》IGN 9分!殿堂级RPG作品
- Twitch新规禁止皮套外露敏感部位 主播直接“真身”出镜
- 木吉他.1994-木吉他作品全集【滚石】【WAV+CUE】
- 莫华伦.2022-一起走过的日子【京文】【WAV+CUE】
- 曾淑勤.1989-装在袋子里的回忆【点将】【WAV+CUE】
- 滚石香港黄金十年系列《赵传精选》首版[WAV+CUE][1.1G]
- 雷婷《乡村情歌·清新民谣》1:1母盘直刻[低速原抓WAV+CUE][1.1G]
- 群星 《DJ夜色魅影HQⅡ》天艺唱片[WAV+CUE][1.1G]
- 群星《烧透你的耳朵2》DXD金佰利 [低速原抓WAV+CUE][1.3G]
- 群星《难忘的回忆精选4》宝丽金2CD[WAV+CUE][1.4G]