python pandas分组聚合详细
作者:FTDdata 发布时间:2022-01-27 22:21:44
python pandas分组聚合
1、环境
python3.9
win10 64bit
pandas==1.2.1
groupby
方法是pandas中的分组方法,对数据框采用groupby
方法后,返回的是DataFrameGroupBy
对象,一般分组操作后会进行聚合操作。
2、分组
import pandas as pd
import numpy as np
pd.set_option('display.notebook_repr_html',False)
# 数据准备
df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [1, 2, 3, 4],'C':[6,8,1,9]})
df
A B C
0 1 1 6
1 1 2 8
2 2 3 1
3 2 4 9
对数据框按A
列进行分组,产生分组数据框。分组数据框是可迭代对象,可以进行循环遍历,可以看出在循环中,每个元素的类型是元组,
元组的第一个元素是分组值,第二个元素是对应的分组数据框。
# 分组
g_df=df.groupby('A')
# 分组数据框类
type(g_df)
pandas.core.groupby.generic.DataFrameGroupBy
# 循环分组数据
for i in g_df:
print(i,type(i),end='\n\n')
(1, A B C
0 1 1 6
1 1 2 8) <class 'tuple'>
(2, A B C
2 2 3 1
3 2 4 9) <class 'tuple'>
可以对分组后的数据框直接使用聚合方法agg
,对分组数据框的每一列计算统计函数值。
# 分组求和
df.groupby('A').agg('sum')
B C
A
1 3 14
2 7 10
3、序列分组
可以根据数据框外的序列数据对数据框进行分组,需要注意序列长度需要与数据框行数相同。
# 定义分组列表
label=['a','a','b','b']
# 分组求和
df.groupby(label).agg('sum')
A B C
a 2 3 14
b 4 7 10
4、多列分组
可以根据数据框的多列对数据框进行分组。
# 数据准备
df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [3, 4, 3, 3],'C':[6,8,1,9]})
df
A B C
0 1 3 6
1 1 4 8
2 2 3 1
3 2 3 9
根据A
,B
列进行分组,然后求和。
# 根据多列分组求和
df.groupby(['A','B']).agg('sum')
C
A B
1 3 6
4 8
2 3 10
5、索引分组
可以根据索引对数据框进行分组,需要设置level参数。
# 数据准备
df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [3, 4, 3, 3],'C':[6,8,1,9]},index=['a','a','b','b'])
df
A B C
a 1 3 6
a 1 4 8
b 2 3 1
b 2 3 9
数据框只有一层索引,设置参数level=0
。
# 根据索引分组求和
df.groupby(level=0).agg('sum')
A B C
a 2 7 14
b 4 6 10
当数据框索引有多层时,也可以根据需求设置level参数,完成分组聚合。
# 数据准备
mi=pd.MultiIndex.from_arrays([[1,1,2,2],[3,4,3,3]],names=['id1','id2'])
df=pd.DataFrame(dict(value=[4,7,2,9]),index=mi)
df
value
id1 id2
1 3 4
4 7
2 3 2
3 9
设置level
参数,如需要根据第一层索引,即id1进行分组,可以设置level=0
或level='id1'
完成分组聚合。
# 根据第一层索引分组求和
df.groupby(level=0).agg('sum')
value
id1
1 11
2 11
# 根据第一层索引分组求和
df.groupby(level='id1').agg('sum')
value
id1
1 11
2 11
7、聚合
分组后一般会进行聚合操作,用agg
方法进行聚合。
# 数据准备
df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [3, 4, 3, 3],'C':[6,8,1,9],'D':[2,5,4,8]})
df
A B C D
0 1 3 6 2
1 1 4 8 5
2 2 3 1 4
3 2 3 9 8
8、单函数对多列
对分组后数据框使用单个函数进行聚合,单个聚合函数会对每列进行计算,然后合并返回。聚合函数以字符串的形式传入。
# 对所有列分组求和
df.groupby('A').agg('sum')
B C D
A
1 7 14 7
2 6 10 12
可以对分组后的数据指定列进行分组聚合。需要注意子列需要用[]包裹
。
# 对指定列分组求和
df.groupby('A')[['B','C']].agg('sum')
B C
A
1 7 14
2 6 10
聚合函数也可以传入自定义的匿名函数。
# 匿名函数分组求和
df.groupby('A').agg(lambda x:sum(x))
B C D
A
1 7 14 7
2 6 10 12
9、多函数对多列
聚合函数可以是多个函数。聚合时,多个聚合函数会对每列进行计算,然后合并返回。聚合函数以列表的形式传入。
# 全部列多函数聚合
df.groupby('A').agg(['sum','mean'])
B C D
sum mean sum mean sum mean
A
1 7 3.5 14 7 7 3.5
2 6 3.0 10 5 12 6.0
聚合返回后的数据列名有两层索引,第一层是聚合的列名,第二层是使用的聚合函数名。如果需要对返回的聚合函数名重命名,
需要在传参时,传入元组,第一个元素为聚合函数名,第二个元素为聚合函数。
# 聚合函数重命名
df.groupby('A').agg([('SUM','sum'),('MEAN','mean')])
B C D
SUM MEAN SUM MEAN SUM MEAN
A
1 7 3.5 14 7 7 3.5
2 6 3.0 10 5 12 6.0
同样,也可以传入匿名函数。
# 匿名函数并重命名
df.groupby('A').agg([('SUM','sum'),('MAX',lambda x:max(x))])
B C D
SUM MAX SUM MAX SUM MAX
A
1 7 4 14 8 7 5
2 6 3 10 9 12 8
如果需要对不同的列进行不同的聚合计算,则需要传入字典的形式。
# 不同列不同聚合函数
df.groupby('A').agg({'B':['sum','mean'],'C':'mean'})
B C
sum mean mean
A
1 7 3.5 7
2 6 3.0 5
可以重命名聚合后的列名,注意只能对一列传入一个聚合函数时有效
。
# 聚合后重命名列名
df.groupby('A').agg(B_sum=('B','sum'),C_mean=('C','mean'))
B_sum C_mean
A
1 7 7
2 6 5
来源:https://www.jianshu.com/p/bd8d6ba29d0e


猜你喜欢
- 前言本文执行环境typescript,版本4.7.4不使用typescript的计算能力,通过类型来实现快排元组快排能否将元组 [3, 1,
- 本文实例教大家如何编写一个vue上传图片组件,具体如下1.首先得有一个[type=file]文件标签并且隐藏,changge事件来获取图片:
- random模块该模块实现了各种分布的伪随机数生成器。(包括在实数轴上计算均匀、正态(高斯)、对数正态、负指数、伽马和贝塔分布的函数)不应将
- 以前没见过这个效果,滚动纵向滚动条看看效果就明白了这样的效果,广告商应该比较喜欢。<!DOCTYPE html PUBLIC &quo
- 当单台MYSQL服务器无法满足当前网站流量时的优化方案。需要搭建mysql集群技术。一、功能:当向主服务器插入|修改|删除数据时,数据会自动
- 网页过渡是指当浏览者进入或离开网页时,页面呈现的不同的刷新效果,比如卷动、百叶窗等。注:通过模板所建网页无法添加网页过渡效果!制作步骤:1、
- 1、使用del语句删除元素>>> i1 = ["a",'b','c',
- 开发新版本 Vue 项目推荐你使用 Vite 脚手架构建开发环境,然而 Vite 脚手架更倾向于构建纯 Web 页面,而不是桌面应用,因此开
- 箱线图介绍箱线图(Box-plot)又称为盒式图或箱型图,是一种用来显示一组数据分散情况的统计图,它能显示一组数据的上界、下界、中位数、上下
- 如下所示:# -*- coding=utf-8 -*- import urllib2import socketimport timeurls
- 第一列按照goodsid局部分组,然后在分组后的记录中按照audittime升序排序得到序号,从而显示某商品得第几次变迁。 第二列是取该商品
- 本文为大家分享了如何用Navicat把csv数据导入mysql,供大家参考,具体内容如下1.获取csv数据,用office另存为功能把exc
- 1、跳过迭代对象的开头string_from_file = """ // Wooden: ...
- 问题给出一段话,由短句组成,短句之间可能被任意标点符号隔开。想要提取所有的短句。解决使用 re.split 函数,用正则式匹配的方法,一次性
- 1.软件环境Windows10 教育版64位Python 3.6.32.问题描述我们在定义一个函数或者是调用一个函数的时候,总是希望能够知道
- 通常情况下,即使MyISAM表格式非常可靠(SQL语句对表做的所有改变在语句返回之前被写下),如果下列任何事件发生,你依然可以获得损坏的表:
- 不可否认,阿里巴巴走得越来越快也越来越好。技术的成熟让很多B2B B2C网站都在跟风学习它们。在这里我就来说一说它的搜索效果吧。如图所示:&
- 一、什么是XSS攻击xss攻击:----->web注入xss跨站脚本攻击(Cross site script,简称xss)是一种“HT
- 如何正确理解和使用Command、Connection和 Recordset三个对象?我知道它们都是连接数据库的“好手”,但在编程的具体应用
- 大概在九九年做游戏网站的时候,就对文章的发布感到麻烦,不过那会儿玩ASP不精。只是将就用着。在遇到长文件 10000 字时网页就是一大片长了