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


Posted in Python onJune 18, 2020

前言

在使用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

到此这篇关于pandas之分组groupby()的使用整理与总结的文章就介绍到这了,更多相关pandas groupby()分组内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现DNS正向查询、反向查询的例子
Apr 25 Python
python脚本设置系统时间的两种方法
Feb 21 Python
Python爬豆瓣电影实例
Feb 23 Python
python设置值及NaN值处理方法
Jul 03 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
使用python3实现操作串口详解
Jan 01 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
python实现mean-shift聚类算法
Jun 10 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
python中time、datetime模块的使用
Dec 14 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 #Python
Python调用shell cmd方法代码示例解析
Jun 18 #Python
Python如何自动获取目标网站最新通知
Jun 18 #Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 #Python
python实现在线翻译
Jun 18 #Python
Python函数的迭代器与生成器的示例代码
Jun 18 #Python
使用python实现名片管理系统
Jun 18 #Python
You might like
简单的PHP留言本实例代码
2010/05/09 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python如何通过实例方法名字调用方法
2018/03/21 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
python3跳出一个循环的实例操作
2020/08/18 Python
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
商务邀请函范文
2014/01/14 职场文书
迁户口计划生育证明
2014/10/19 职场文书
单位同意报考证明
2015/06/17 职场文书
python中的None与NULL用法说明
2021/05/25 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python