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操作mysql中文显示乱码的解决方法
Oct 11 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
Python处理CSV与List的转换方法
Apr 19 Python
python 编码规范整理
May 05 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
Python threading.local代码实例及原理解析
Mar 16 Python
PyCharm中关于安装第三方包的三个建议
Sep 17 Python
如何使用Python进行PDF图片识别OCR
Jan 22 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 cache类代码(php数据缓存类)
2010/04/15 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
javascript中的float运算精度实例分析
2010/08/21 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
python实现简单登陆流程的方法
2018/04/22 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python交互式图形编程的实现
2019/07/25 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
游戏商店:Eneba
2020/04/25 全球购物
财政专业求职信范文
2014/02/19 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
体育课外活动总结
2014/07/08 职场文书
授权委托书
2014/07/31 职场文书
2014年妇联工作总结
2014/11/21 职场文书
婚庆司仪开场白
2015/05/29 职场文书
退伍军人感言
2015/08/01 职场文书
婚庆答谢词大全
2015/09/29 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android