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
猜你喜欢
- 可能很多人都要问,网站的文字还需要设计吗?对于很多的网站来说,字在整个网站的内容中占了80%以上甚至更多,或者换个角度上说,网站可以没有颜色
- 作为前端开发工程师,平时对于Dom的查找遍历和操作是家常便饭。对于优秀的前端来说,也肯定早已有了自己的一套方法来封装这些重复的操作。但是,现
- 前文昨天家里来人,老姐的小孩儿抢着跟我玩电脑,result........很久很久之后!!那你想错了,我可不是欺负小孩子的那种人。老实人本人
- 最近写一个和二维列表有关的算法时候发现的当用max求二维列表中最大值时,输出的结果是子列表首元素最大的那个列表测试如下c=[[1,2,-1]
- 写程序的人在编写由asp页面生成静态页面html的时候,如果同时生成大量页面,一定遇到过浏览器下方的进度条上显示着3%,6%,10%等缓慢增
- atan()方法返回x的反正切值,以弧度表示。Syntax以下是atan()方法的语法:atan(x)注意:此函数是无法直接访问
- 刚才帮一位朋友做跳转的时候做的,为了获取完整的url地址,还是花了那么点时间不过现在看来,原来是那么简单,没有网上那么多复杂的东东,相信一定
- 1. Cookie 介绍HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信。Cookie 就是
- 1、给定一个数据集noise-data-1.txt,该数据集中保护大量的缺失值(空格、不完整值等)。利用“全局常量”、“均值或者中位数”来填
- 前言在这篇文章中,准备用 Python 从头开始实现一个全连接的神经网络。你可能会问,为什么需要自己实现,有很多库和框架可以为我们做这件事,
- Python2.7还是一个比较稳定的版本,目前80%以上的公司都在使用python2.7的版本。他不会在安装的时候报编码错误之类的问题。但是
- Python由于语言的简洁性,让我们以人类思考的方式来写代码,新手更容易上手,老鸟更爱不释手。要写出 Pythonic(优雅的、地道的、整洁
- 之前写爬虫程序的时候,采用生产者和消费者的模式,利用Queue作为生产者进程和消费者进程之间的同步队列。执行程序时,总是秒退,加了断点也无法
- python调用文件时找不到相对路径current_path = os.path.dirname(__file__)if current_p
- 简介程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作,一般是将数字化为二进制数后进行操作
- Python 提供了两个级别访问的网络服务。低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访
- 前言很多时候开发者需要删除文件。可能是他错误地创建了文件,或者不再需要该文件。无论出于何种原因,都有一些方法可以通过Python来删除文件,
- Python DataFrame 如何设置列表字段/元素类型?比如笔者想将列表的两个字段由float64设置为int64,那么就要用到Dat
- python逆序的三位数程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入7
- String(字符型)–%s integer(整形)–%d float(浮点型)–%f实例我们需要输出一个人的信息代码:#coding=ut