python中分组函数groupby和分组运算函数agg的使用
作者:数据小白的进阶之路 发布时间:2023-05-25 03:15:48
标签:python,分组函数,groupby,agg
今天来介绍pandas中一个很有用的函数groupby,其实和hive中的groupby的效果是一样的,区别在于两种语言的写法问题。groupby在Python中的分组统计中很有用~
groupby:
首先创建数据:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'],
'B': [2, 7, 1, 3, 3, 2, 4, 8],
'C': [100, 87, 96, 130, 105, 87, 96, 155]})
df
Out[2]:
A B C
0 a 2 100
1 b 7 87
2 a 1 96
3 c 3 130
4 a 3 105
5 c 2 87
6 b 4 96
pandas中groupby的基本操作:
1、按A列进行分组,求B、C两列的均值:
df.groupby('A').mean()
Out[6]:
B C
A
a 2.000000 100.333333
b 5.500000 91.500000
c 4.333333 124.000000
当然也可以按照多列进行分组,获取其他列的均值:
df.groupby(['A','B']).mean()
Out[7]:
C
A B
a 1 96
2 100
3 105
b 4 96
7 87
c 2 87
3 130
8 155
2、分组后,选择列进行计算:
data=df.groupby('A')
data['B'].std()
Out[11]:
A
a 1.00000
b 2.12132
c 3.21455
Name: B, dtype: float64
#选择B、C两列
data['B','C'].mean()
Out[12]:
B C
A
a 2.000000 100.333333
b 5.500000 91.500000
c 4.333333 124.000000
3、按A进行分组后,可以对不同的列采用不同的聚合方法(ps:这一点就和hive很相像了)
data.agg({'B':'mean','C':'sum'}) #B列均值,C列汇总
Out[14]:
C B
A
a 301 2.000000
b 183 5.500000
c 372 4.333333
4、如果按照A进行分组后,对多列采用相同的聚合方法,我们可以借助apply函数:
df.groupby('A').apply(np.mean)
Out[25]:
B C
A
a 2.000000 100.333333
b 5.500000 91.500000
c 4.333333 124.000000
5、将某列数据按数据值分成不同范围段进行分组运算
创建数据集:
np.random.seed(0)
df = pd.DataFrame({'Age': np.random.randint(20, 70, 100),
'Sex': np.random.choice(['Male', 'Female'], 100),
'number_of_foo': np.random.randint(1, 20, 100)})
Out[38]:
Age Sex number_of_foo
0 64 Female 14
1 67 Female 14
2 20 Female 12
3 23 Male 17
4 23 Female 15
目标:将age字段分成三组,有如下两种方法实现:
#第一种方法:
1、bins=4
pd.cut(df['Age'], bins=4)
0 (56.75, 69.0]
1 (56.75, 69.0]
2 (19.951, 32.25]
3 (19.951, 32.25]
4 (19.951, 32.25]...
#第二种方法
2、bins=[19, 40, 65, np.inf]
pd.cut(df['Age'], bins=[19,40,65,np.inf])
Out[40]:
0 (40.0, 65.0]
1 (65.0, inf]
2 (19.0, 40.0]
3 (19.0, 40.0]
4 (19.0, 40.0]
#分组范围结果如下:
age_groups = pd.cut(df['Age'], bins=[19,40,65,np.inf])
df.groupby(age_groups).mean()
Out[43]:
Age number_of_foo
Age
(19.0, 40.0] 29.840000 9.880000
(40.0, 65.0] 52.833333 9.452381
(65.0, inf] 67.375000 9.250000
#按‘Age'分组范围和性别(sex)进行制作交叉表
pd.crosstab(age_groups, df['Sex'])
Out[44]:
Sex Female Male
Age
(19.0, 40.0] 22 28
(40.0, 65.0] 18 24
(65.0, inf] 3 5
agg:
1、使用groupby按照某列(A)进行分组后,需要对另外一列采用不同的聚合方法:
df.groupby('A')['B'].agg({'mean':np.mean, 'std': np.std})
Out[16]:
std mean
A
a 1.00000 2.000000
b 2.12132 5.500000
c 3.21455 4.333333
2、按照某列进行分组后,对不同的列采用不同的聚合方法:
df.groupby('A').agg({'B':[np.mean,'sum'],'C':['count',np.std]}) #[]中对应的是两种方法
Out[17]:
C B
count std mean sum
A
a 3 4.509250 2.000000 6
b 2 6.363961 5.500000 11
c 3 34.394767 4.333333 13
transform:
前面两种方法得到的结果是以A列值为索引的结果,如果使用没有进行groupby分组的index的话,该怎么操作呢?此时就要用到transform函数了。transform(func, args, *kwargs) 方法简化了这个过程,: func 参数应用到所有分组,然后把结果放置到原数组的 index 上:
df
Out[31]:
A B C
0 a 2 100
1 b 7 87
2 a 1 96
3 c 3 130
4 a 3 105
5 c 2 87
6 b 4 96
7 c 8 155
df.groupby('A')['B','C'].transform('count') #注:count函数在计算时,不计算nan值
Out[32]:
B C
0 3 3
1 2 2
2 3 3
3 3 3
4 3 3
5 3 3
6 2 2
7 3 3
从中可以看出:按A列进行分组,对B、C两列进行计数时,B为a的索引有[0,2,4],所以结果列的中[0,2,4]索引的值都为3,相当于广播了。对于C列,同理。
来源:https://blog.csdn.net/weixin_37536446/article/details/82109431
0
投稿
猜你喜欢
- 在django操作数据库的时候如何找出内容不为空的数据呢?from django.db.models import Qclass Index
- Mysql自增主键id不是以此逐级递增一、介绍在mysql数据库添加数据时使用ON DUPLICATE KEY UPDATE进行数据更新时可
- 在Python教程里,针对默认参数,给了一个“重要警告”的例子:def f(a, L=[]): L.append(a) &nbs
- 如果您刚刚开始接触网页设计,是不是经常发生这样的问题呢?做好的网页在自己机器上可以正常浏览,而把页面传到服务器上就总是出现看不到图片,css
- hasattr()函数hasattr()函数用于判断是否包含对应的属性语法:hasattr(object,name)参数:object--对
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- ASP.net与SQLite数据库通过js和ashx交互(连接和操作):废话(也是思路):用的是VS2010,打算做网站前后台。由于不喜欢前
- MySQL使用limit进行分页select * from stu limit m,n; // m=(pageIndex-1)*pageSi
- 首先,下面贴上designer处理的界面文件(转换成py后的):# -*- coding: utf-8 -*-# Form implemen
- quicktool/view.py文件修改视图函数index(),渲染一个home.html模板from django.shortcuts
- 如何制作一个防止多次刷新计数的图片计数器?请问如何做一个专业的图片计数器? <%countlong
- VS2013的简单WInForm控件,通过WebRequest,WebResponse来访问,接收:private void btn_int
- LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要
- 本文实例为大家分享了python实现人民币转大写人民币的具体代码,供大家参考,具体内容如下直接上代码:# -*- coding: utf-8
- 本文实例讲述了ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能。分享给大家供大家参考,具体如下:验证码现在是用户登录、
- 之前遇到技术问题总能在技术博客上得到启发,十分感谢各位的无私分享。而自己却很少发文,固然是水平有限,但也限制了知识积累和总结。今后多总结分享
- Mysql环境变量配置mysql的环境变量配置步骤1.1、在桌面选择“计算机”的图标,右键&
- 我就废话不多说了,还是直接看代码吧!# -*- coding: utf-8 -*-# @author flynetcnimport sys,
- 事件是什么 ?JavaScript与HTML交互是通过在用户或浏览器操纵页面上发生的事件进行处理。当页面加载,这是一个事件。当用
- 前言在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤一般地,我们去网上批量打开壁纸的时候一般操作如下:1、打开壁纸网页2、