前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >pandas之分组groupby()的使用整理与总结

pandas之分组groupby()的使用整理与总结

作者头像
全栈程序员站长
发布2022-08-24 19:51:12
发布2022-08-24 19:51:12
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录
  • 前言
  • 准备
  • 基本操作
  • 可视化操作
  • REF

前言

在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别进行分组来进行分析,这时通过pandas下的groupby()函数就可以解决。在使用pandas进行数据分析时,groupby()函数将会是一个数据分析辅助的利器。 groupby的作用可以参考 超好用的 pandas 之 groupby 中作者的插图进行直观的理解:

准备

读入的数据是一段学生信息的数据,下面将以这个数据为例进行整理grouby()函数的使用:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('./data.csv')
print(df)
代码语言:javascript
代码运行次数:0
运行
复制
      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对象中具有的函数和方法进行调用。

代码语言:javascript
代码运行次数:0
运行
复制
grouped = df.groupby('Gender')
print(type(grouped))
print(grouped)

<class 'pandas.core.groupby.groupby.DataFrameGroupBy'>

分组时,不仅仅可以指定一个列名,也可以指定多个列名:

代码语言:javascript
代码运行次数:0
运行
复制
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)将一个是单个主键,另一个则是一个元组的形式:

代码语言:javascript
代码运行次数:0
运行
复制
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对象的索引重新定义可以通过:

代码语言:javascript
代码运行次数:0
运行
复制
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对象,这里可以类比DataFrameSeries的关系。

按照上面的思路理解后,再调用get_group()函数后得到的DataFrame对象按照列名进行索引实际上就是得到了Series的对象,下面的操作就可以按照Series对象中的函数行了。

在没有进行调用get_group(),也就是没有取出特定某一组数据之前,此时的数据结构任然是DataFrameGroupBy,其中也有很多函数和方法可以调用,如max()count()std()等,返回的结果是一个DataFrame对象。

代码语言:javascript
代码运行次数:0
运行
复制
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或者自定义的函数,前提是返回一个聚合值。

代码语言:javascript
代码运行次数:0
运行
复制
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,前者是对所有的数值进行一个聚合的操作,而后者则是对每个数值进行单独的一个操作:

代码语言:javascript
代码运行次数:0
运行
复制
def addOne(data):
    return data + 1

df['Age'] = df['Age'].apply(addOne)
df['Age'] = df['Age'].apply(int)
可视化操作

对组内的数据绘制概率密度分布:

代码语言:javascript
代码运行次数:0
运行
复制
grouped['Age'].plot(kind='kde', legend=True)
plt.show()

由于grouped['Age']是一个SeriesGroupby对象, 顾名思义, 就是每一个组都有一个Series. 所以直接plot相当于遍历了每一个组内的Age数据。

REF

groupby官方文档 超好用的 pandas 之 groupby

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141267.html原文链接:https://javaforall.cn

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
    • 前言
    • 准备
    • 基本操作
    • 可视化操作
    • REF
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档