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

作者:敲代码的quant 时间:2022-04-23 17:24:42 

前言

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

groupby的作用可以参考 超好用的 pandas 之 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对象,这里可以类比DataFrameSeries的关系。

按照上面的思路理解后,再调用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()

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

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

REF

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

来源:https://blog.csdn.net/FrankieHello/article/details/97272990

标签:pandas,groupby(),分组
0
投稿

猜你喜欢

  • 分析Python中解析构建数据知识

    2022-01-12 10:23:48
  • Scrapy项目实战之爬取某社区用户详情

    2022-04-16 11:36:31
  • Date对象格式化方法

    2009-11-16 13:17:00
  • 讲解无法打开用户默认数据库的解决方法

    2008-12-05 15:55:00
  • mysql中in条件使用字符串方式

    2024-01-28 02:24:55
  • mysqldump备份数据库时排除某些库的实例

    2024-01-14 16:44:45
  • Utf-8和Gb2312乱码问题的终结

    2008-04-05 14:04:00
  • Python 多进程并发操作中进程池Pool的实例

    2022-06-28 16:31:37
  • Python中用max()方法求最大值的介绍

    2021-12-08 09:33:06
  • python实现单机五子棋对战游戏

    2022-01-11 04:38:10
  • NopCommerce架构分析(一)Autofac依赖注入类生成容器

    2023-07-11 21:20:27
  • 探讨Oracle中的&号问题

    2024-01-22 09:13:31
  • Golang使用Gin框架实现路由分类处理请求流程详解

    2024-05-29 22:07:41
  • Python学习之pip包管理工具的使用

    2023-07-24 11:01:57
  • MySQL case when使用方法实例解析

    2024-01-29 03:15:55
  • python人工智能深度学习算法优化

    2023-04-21 15:46:40
  • python实现余弦相似度文本比较的示例

    2023-01-18 09:17:48
  • 微信跳一跳python辅助脚本(总结)

    2023-01-04 00:56:23
  • ThinkPHP视图查询详解

    2024-05-03 15:52:08
  • 详解利用Python制作中文汉字雨效果

    2023-04-26 07:09:17
  • asp之家 网络编程 m.aspxhome.com