前言
在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别进行分组来进行分析,这时通过pandas下的groupby()函数就可以解决。在使用pandas进行数据分析时,groupby()函数将会是一个数据分析辅助的利器。
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
对象,这里可以类比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 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()
由于grouped['Age']
是一个SeriesGroupby
对象, 顾名思义, 就是每一个组都有一个Series
. 所以直接plot相当于遍历了每一个组内的Age数据。
REF
groupby官方文档
超好用的 pandas 之 groupby
来源:https://blog.csdn.net/FrankieHello/article/details/97272990
猜你喜欢
- 从控制台输入要出的拳 —— 剪刀(0)/石头(1)/布(2) 电脑 **随机*
- 比如:import linecacheprint linecache.getline('2.1_open.py&
- 基本概念简单地说,Node.js是在服务器端运行的JavaScript。 节点。$ node> console.log('He
- 1、概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用。本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试。原图
- 最近,小明为了达成小姐姐的愿望,在某宝买到心仪的宝贝,再加上又迷上了python,就通过python轻而易举地实现了(个人声明:对Java来
- 前言:我的python学习也告一段落了。不过有些,方法还是打算总结一下和大家分享。我整理了使用matplotlib绘制折线图的一般步骤,按照
- [前言:]ASP.NET是微软提供的最新的开发基于Web的应用程序的技术。它提供了大量的比传统ASP脚本技术的好处,包括:1)通过把UI表现
- Oracle和mysql的一些简单命令对比 1)SQL> select to_char(sysdate,'yyyy-mm-dd
- 背景:有一个爬虫服务,需要定时从公开网站上拉取一些数据,为了避免被识别为爬虫(防爬虫的识别需要根据很多特征,时间仅仅是其中一个维度),需要在
- 由于在Python2 中的默认编码为ASCII,但是在Python3中的默认编码为UTF-8。问题:所以在使用np.load(det.npy
- 一、基于socket实现的TCP客户端import socket # 建立socket对象# 参数一表示IP地址类型(AF_INE
- 一、什么是进程进程是执行中的程序,是资源分配的最小单位:操作系统以进程为单位分配存储空间,进程拥有独立地址空间、内存、数据栈等操作系统管理所
- MySQL 5.1采用了基于密码混编算法的鉴定协议,它与早期客户端(4.1之前)使用的协议不兼容。如果你将服务器升级到4.1之上,用早期的客
- 前言pytest是一款强大的python自动化测试工具,可以胜任各种类型或者级别的软件测试工作。pytest提供了丰富的功能,包括asser
- 本文实例讲述了wxPython窗口的继承机制,分享给大家供大家参考。具体分析如下:示例代码如下:import wx class
- 本文实例分析了php文件操作的方法。分享给大家供大家参考,具体如下:一、删除文件unlink()语法: int unlink(string
- 如下所示:#!/usr/bin/env pythonimport osimport sysclass CConsole: M_MAP_COL
- 下文分步骤给大家介绍的非常详细,具体详情请看下文吧。一、准备用两台服务器做测试:Master Server: 192.0.0.1/Linux
- 前言模糊查询是数据库的基本操作之一,实现对给定的字符串是否与指定的模式进行匹配。如果字符完全匹配,可以用=等号表示,如果部分匹配可认为是一种
- 元素的CSS样式,除了包括内联的(即通过style属性加上的)样式定义外,还有页面嵌入的css和外部引入的css两种方式。但在JS中通过el