pandas中df.groupby()方法深入讲解
作者:HTDiiii 发布时间:2024-01-01 15:30:24
分组:根据研究目的,将所有样本点按照一个或多个属性划分为多个组,就是分组。
pandas中,数据表就是DataFrame对象,分组就是groupby方法。将DataFrame中所有行按照一列或多列来划分,分为多个组,列值相同的在同一组,列值不同的在不同组。
分组后,就得到一个groupby对象,代表着已经被分开的各个组。后续所有的动作,比如计数,求平均值等,都是针对这个对象,也就是都是针对各个组。即在每个组组内进行计数,求平均值等。
分组的返回结果
df = pd.DataFrame([['a', 'man', 120, 90],
['b', 'woman', 130, 100],
['a', 'man', 110, 108],
['a', 'woman', 120, 118]], columns=['level', 'gender', 'math','chinese'])
group = df.groupby('gender')
df.groupby() 函数返回的对象是一系列键值对,其中键是分组的字段值,值是该字段值下的数据表。分组的结果是无法直接输出的,print()只能看到该结果的数据类型。可以用循环对分组后的结果进行遍历。
print(group)
# <pandas.core.groupby.generic.DataFrameGroupBy object at 0x11cb60f50>
for key, value in group:
print(key)
print(value)
print("")
man
level gender math chinese
0 a man 120 90
2 a man 110 108
woman
level gender math chinese
1 b woman 130 100
3 a woman 120 118
按一列分组:df.groupby(column)
group = df.groupby('gender') # 按照'gender'列的值来分组,创建一个groupby对象
# group = df.groupby(['gender']) # 等价写法
for key, df in group:
print(key)
print(df)
man
level gender math chinese
0 a man 120 90
2 a man 110 108
woman
level gender math chinese
1 b woman 130 100
3 a woman 120 118
按多列分组:df.groupby([column1, column2])
group = df.groupby(['gender', 'level'])
# 先按照'grade'列的值来分组。每组内,再按'level'列来分组。也返回一个groupby对象
for key, value in group:
print(key)
print(value)
print("")
('man', 'a')
level gender math chinese
0 a man 120 90
2 a man 110 108
('woman', 'a')
level gender math chinese
3 a woman 120 118
('woman', 'b')
level gender math chinese
1 b woman 130 100
查看每组的统计数据:df.groupby(column).describe()
对数据表中的数值列进行统计,给出包括count = 计数,mean = 平均数,std = 方差,min = 最小值,25% = 四分位数,50% = 二分位数,75% = 四分之三分位数,max = 最大值的信息。不会对非数值列统计。
返回的是一个dataframe。
查看所有列的统计信息
group = df.groupby(['gender'])
df1 = group.describe()
# df1 = df.groupby(['gender']).describe() # 等价写法
print(type(df1))
print(df1)
<class 'pandas.core.frame.DataFrame'>
math chinese \
count mean std min 25% 50% 75% max count
gender
man 2.0 115.0 7.071068 110.0 112.5 115.0 117.5 120.0 2.0
woman 2.0 125.0 7.071068 120.0 122.5 125.0 127.5 130.0 2.0
mean std min 25% 50% 75% max
gender
man 99.0 12.727922 90.0 94.5 99.0 103.5 108.0
woman 109.0 12.727922 100.0 104.5 109.0 113.5 118.0
查看指定列的统计信息
group = df.groupby(['gender'])
df1 = group.describe()['math'] # 只看math列的统计信息
print(df1)
count mean std min 25% 50% 75% max
gender
man 2.0 115.0 7.071068 110.0 112.5 115.0 117.5 120.0
woman 2.0 125.0 7.071068 120.0 122.5 125.0 127.5 130.0
查看纵向视图
unstack()可以将每列的统计信息垂直排列。
group = df.groupby(['gender'])
df1 = group.describe().unstack()
print(df1)
gender
math count man 2.000000
woman 2.000000
...
max man 120.000000
woman 130.000000
chinese count man 2.000000
woman 2.000000
...
woman 113.500000
max man 108.000000
woman 118.000000
dtype: float64
组内离散列计数:df.groupby(column)[column2].value_counts()
数据表中的列按值是否连续,可以分为连续值列、离散值列。对于离散值列,可以统计其不重复值的个数。对于连续值列,统计不重复值一般没有意义。统计结果是一个Series对象。
group = df.groupby(['gender'])
df1 = group['level'].value_counts() # 统计'level'列的不重复值个数
print(type(df1))
print(df1)
<class 'pandas.core.series.Series'>
gender level
man a 2
woman a 1
b 1py
Name: level, dtype: int64
组内数值列和:df.groupby(column).sum()
group = df.groupby(['gender'])
df1 = group.sum()
print(df1)
math chinese
gender
man 230 198
woman 250 218
组内成员数:df.groupby(column).count()
每组内,按列统计每组的成员数。每列的统计结果是一样的
group = df.groupby(['gender'])
df1 = group.count()
print(df1)
level math chinese
gender
man 2 2 2
woman 2 2 2
组内数值列均值:df.groupby(column).mean()
每组内,统计所有数值列的均值,非数值列无均值。
所有组的均值
group = df.groupby(['gender'])
df1 = group.mean()
print(df1)
math chinese
gender
man 115 99
woman 125 109
单组的均值
group = df.groupby(['gender'])
df1 = group['math'].mean()
print(df1)
gender
man 115
woman 125
Name: math, dtype: int64
组内数值列最大值:df.groupby(column).max()
每组内,统计所有数值列的最大值,非数值列无最大值
统计所有数值列的最大值
group = df.groupby(['gender'])
df1 = group.max()
print(df1)
level math chinese
gender
man a 120 108
woman b 130 118
统计单个数值列的最大值
group = df.groupby(['gender'])
df1 = group['math'].max()
print(df1)
gender
man 120
woman 130
Name: math, dtype: int64
组内应用函数:df.groupby(column1)[column2].apply()
group = df.groupby(['gender'])
df1 = group['math'].apply(np.mean) # 求组内均值
print(df1)
gender
man 115.0
woman 125.0
Name: math, dtype: float64
组内不同列用不同函数:df.groupby(column).agg({column1:func, column2:func,…})
group = df.groupby(['gender'])
df1 = group.agg({'math':np.mean, 'chinese':np.std})
print(df1)
math chinese
gender
man 115 12.727922
woman 125 12.727922
来源:https://blog.csdn.net/HTDiiii/article/details/127000069


猜你喜欢
- 我们知道,一般的关系数据库(如SQL Server、Oracle、Access等)中的查询操作是支持集合操作的,例如可以用“Update A
- go-cqhttp安装一、 简介1、 介绍官方文档地址:https://docs.go-cqhttp.org/各种框架都只是机器人的各种实现
- 目录1安装loguru|2loguru简单使用|3loguru保留日志文件|4loguru字符串输出|5loguru封装类,可以直接拿去用!
- 一、所需库安装pip install PyAudiopip install SpeechRecognitionpip install bai
- python中字符串数组如何逆序排列?下面给大家介绍几种方法:1、数组倒序:原始元素的倒序排列(1)切片>>> arr =
- 每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们
- 一、单因素分析线性拟合功能:线性拟合,单因素分析,对散点图进行线性拟合,并放大散点图的局部位置输入:某个xlsx文件,包含'患者密度
- 分别为:1.倒计定时器:timename=setTimeout("function();",delaytime);2.循
- 假定业务:查看在职员工的薪资的第二名的员工信息创建数据库drop database if exists emps;create databa
- 本文实例讲述了Python决策树之基于信息增益的特征选择。分享给大家供大家参考,具体如下:基于信息增益的特征选取是一种广泛使用在决策树(de
- 之道的易搜项目中的搜索分类是通过JS动态生成的,每个生成的元素都要动态的添加属性、事件。其中,添加属性可以采用赋值的方式,这对IE和FF都是
- python的使用之所以方便,原因之一就是各种数据类型各样轻松的转换,例如numpy数组和list的相互转换,只需要函数方法的使用就可以处理
- 代码如下:# -*- coding: utf-8 -*-#!/usr/bin/python# filename: todo.py# code
- 茎叶图from itertools import groupbynums2=[225, 232,232,245,235,245,270,22
- 问题在一个python web应用中需要定时执行一些任务,所以用了APScheduler这个库。又因为是用flask这个web框架,所以用了
- Go语言拼接URL路径有多种方法建议用ResolveReference。JoinPathJoinPath会把多个多个路径合并成一个路径,并且
- 柱形图bar()函数绘制柱形图import matplotlib.pyplot as plx = [1,2,3,4,5,6,7]y = [1
- 上个周末去书店时碰巧看到了AS3 CookeBook,我记得在apollo的alpha版快出来的时候,7yue就推荐过这个小册子,只不过我已
- 中间那个控制块,其实也是一个iframe,把他的宽度定义为10。 然后在他的内部js,控制 左右2个iframe. functio
- 本文实例讲述了Python双链表原理与实现方法。分享给大家供大家参考,具体如下:Python实现双链表文章目录Python实现双链表定义链表