时间:2021-05-22
前言
在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别进行分组来进行分析,这时通过pandas下的groupby()函数就可以解决。在使用pandas进行数据分析时,groupby()函数将会是一个数据分析辅助的利器。
groupby的作用可以参考 超好用的 pandas 之 groupby 中作者的插图进行直观的理解:
准备
读入的数据是一段学生信息的数据,下面将以这个数据为例进行整理grouby()函数的使用:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltdf = pd.read_csv('./data.csv')print(df) Name Gender Age Score0 Alen Male 18 801 Bob Male 19 902 Cidy Female 18 933 Daniel Male 20 874 Ellen Female 17 965 Frankie Male 21 1006 Gate Male 20 887 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())GenderFemale 3Male 5dtype: int64Gender AgeFemale 17 1 18 1 22 1Male 18 1 19 1 20 2 21 1dtype: int64指定多个列名个单个列名后的区别在于,分组的主键或者索引(indice)将一个是单个主键,另一个则是一个元组的形式:
print(grouped.get_group('Female'))print(grouped_muti.get_group(('Female', 17))) Name Gender Age Score2 Cidy Female 18 934 Ellen Female 17 967 Hebe Female 22 98 Name Gender Age Score4 Ellen Female 17 96通过调用get_group()函数可以返回一个按照分组得到的DataFrame对象,所以接下来的使用就可以按照·DataFrame·对象来使用。如果想让这个DataFrame对象的索引重新定义可以通过:
df = grouped.get_group('Female').reset_index()print(df) index Name Gender Age Score0 2 Cidy Female 18 931 4 Ellen Female 17 962 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 ScoreGender Female 3 3 3Male 5 5 5 Age ScoreGender Female 22 98Male 21 100 Age ScoreGender Female 19.0 95.666667Male 19.6 89.000000如果其中的函数无法满足你的需求,你也可以选择使用聚合函数aggregate,传递numpy或者自定义的函数,前提是返回一个聚合值。
def getSum(data): total = 0 for d in data: total+=d return totalprint(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 + 1df['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
到此这篇关于pandas之分组groupby()的使用整理与总结的文章就介绍到这了,更多相关pandas groupby()分组内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
GROUPBY是分组查询,一般GROUPBY是和聚合函数配合使用,你可以想想你用了GROUPBY按ITEM.ITEMNUM这个字段分组,那其他字段内容不同,变成
Oracle中groupby用法在select语句中可以使用groupby子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用
一、groupby能做什么?python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算!对于数据的分组和分组运算主要是指groupby函数的
数据分组使用groupby()方法进行分组group.size()查看分组后每组的数量group.groups查看分组情况group.get_group('名字
本文实例讲述了mysql使用GROUPBY分组实现取前N条记录的方法。分享给大家供大家参考,具体如下:MySQL中GROUPBY分组取前N条记录实现mysql分