pandas groupby 用法实例详解
作者:bitcarmanlee 发布时间:2023-07-19 01:37:59
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.分组groupby
在日常数据分析过程中,经常有分组的需求。具体来说,就是根据一个或者多个字段,将数据划分为不同的组,然后进行进一步分析,比如求分组的数量,分组内的最大值最小值平均值等。在sql中,就是大名鼎鼎的groupby操作。
pandas中,也有对应的groupby操作,下面我们就来看看pandas中的groupby怎么使用。
2.groupby的数据结构
首先我们看如下代码
def ddd():
levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
nums = [10, 20, 30, 20, 15, 10, 12]
df = pd.DataFrame({"level": levels, "num": nums})
g = df.groupby('level')
print(g)
print()
print(list(g))
输出结果如下:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x10f6f96d0>
[('L1', level num
0 L1 10
1 L1 20
2 L1 30), ('L2', level num
3 L2 20
4 L2 15), ('L3', level num
5 L3 10
6 L3 12)]
做groupby操作以后,得到的是一个DataFrameGroupBy对象,直接打印该对象的话,显示的是其内存地址。
为了方便地观察数据,我们使用list方法转换一下,发现其是一个元组,元组中的第一个元素,是level的值。元祖中的第二个元素,则是其组别下的整个dataframe。
3.groupby的基本用法
def group1():
levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
nums = [10, 20, 30, 20, 15, 10, 12]
scores = [100, 200, 300, 200, 150, 100, 120]
df = pd.DataFrame({"level": levels, "num": nums, "score": scores})
result = df.groupby('level').agg({'num': 'sum', 'score': 'mean'})
allnum = result['num'].sum()
result['rate'] = result['num'].map(lambda x: x / allnum)
print(result)
最后输出:
num score rate
level
L1 60 200 0.512821
L2 35 175 0.299145
L3 22 110 0.188034
上面的例子展示了groupby的基本用法。
对dataframe按照level分组,然后对num列求和,对score列求平均值,可以得到result。
同时,我们还希望得到每个分组中,num的和在所有num和中的占比。于是我们先求num的综合,然后在用map方法,给result添加一列,求得其占比!
4.transform的用法
下面我们看一个更复杂的例子。
def t10():
levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
nums = [10, 20, 30, 20, 15, 10, 12]
df = pd.DataFrame({"level": levels, "num": nums})
ret = df.groupby('level')['num'].mean().to_dict()
df['avg_num'] = df['level'].map(ret)
print(ret)
print(df)
{'L1': 20.0, 'L2': 17.5, 'L3': 11.0}
level num avg_num
0 L1 10 20.0
1 L1 20 20.0
2 L1 30 20.0
3 L2 20 17.5
4 L2 15 17.5
5 L3 10 11.0
6 L3 12 11.0
上面的方法,我们对level分组以后,我们想给数据集添加一列,想给每行数据添加每个level对应的平均值。
上面的解法是先求得每个分组的平均值,转成一个dict,然后再使用map方法将每组的平均值添加上去。
def trans():
levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
nums = [10, 20, 30, 20, 15, 10, 12]
df = pd.DataFrame({"level": levels, "num": nums})
df['avg_num'] = df.groupby('level')['num'].transform('mean')
print(df)
如果使用transform方法,代码可以更简单更直观,如上所示。
transform方法的作用:调用函数在每个分组上产生一个与原df相同索引的dataFrame,整体返回与原来对象拥有相同索引且已填充了转换后的值的dataFrame,相当于就是给原来的dataframe添加了一列。
来源:https://blog.csdn.net/bitcarmanlee/article/details/111501223


猜你喜欢
- 前言作为Web开发人员,在 Web浏览器中存储数据以改善用户体验和提升Web应用程序性能是非常常见的。在大多数情况下,可供我们使用就是Loc
- 业务场景:1、在数据库表中的数据,要求记录每一条新增数据的创建时间,时间格式要求明确至:年月日:时分秒。2、在数据库表中的数据,要求记录每一
- 本文根据自己初学经验编写的使用xlwt模块设置单元格的一些基本样式,如设置单元格的背景颜色,下框线,字体,字体的颜色,设置列宽行高,插入简单
- 网页显示不正常,出现图片错位,文字跑远……等等,别急,试试IE8自带的”兼容性视图”功能吧!其实出现网页显示问题,一般不是您的电脑或者浏览器
- 1. 确认已经安装了NT/2000和SQL Server的最新补丁程序,不用说大家应该已经安装好了,但是我觉得最好还是在这里提醒一下。2.
- 本文实例讲述了JavaScript中匿名函数用法。分享给大家供大家参考。具体分析如下:JS中可以不用给函数名称,而是在使用时直接通过func
- mysql_query("set autocommit=0"); $list_one = $db->fetch_f
- 1.列表:list# 1.list:Python内置的一种数据类型,列表;# 2.list是一种有序的集合,可以随时添加和删除其中的元素;#
- 线性回归是基本的统计和机器学习技术之一。经济,计算机科学,社会科学等等学科中,无论是统计分析,或者是机器学习,还是科学计算,都有很大的机会需
- PHP+MySQL的组合是构建网站的一个常见搭配,不过如何使用PHP通过Web访问MySQL数据库呢?下面从Web数据库架构的工作原理讲起。
- 本文实例讲述了jsp中select的onchange事件用法。分享给大家供大家参考,具体如下:<script language = &
- 看这篇文章前强烈建议你看看上一篇python实现梯度下降法:一、为什么要提出随机梯度下降算法注意看梯度下降法权值的更新方式(推导过程在上一篇
- 博主本地环境:VMwareCentos7.6django2.22python3.6出现这个的原因分析:第一:您在VMware中的虚拟主机地址
- 封装为dll会带来很多的好处,主要包括只是产权的保护,以及效率和安全性能的提升。这个例子中被封装的dll文件可以隐藏access数据库的实际
- 1.MySQL中并发和隔离控制机制Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition
- 废话不多说了直接给大家贴代码了。代码如下:<script language="JavaScript"><
- centos6自带python2.6版本,根据需要,安装python2.7、easy_install-2.7、pip2.7依赖yum gro
- 解决这个问题的办法有三种: 1. 增加 MySQL 的 wait_timeout 属性的值。 修改 /etc/mysql/my.cnf文件,
- 快速上手我们都知道go语言没有原生的注解,但是做业务开发有些时候没有注解确实不方便。go-doudou通过go语言标准库ast/parser
- 前言删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间