pandas groupby 用法详解

pandas groupby 用法详解1.分组groupby在日常数据分析过程中,经常有分组的需求。具体来说,就是根据一个或者多个字段,将数据划分为不同的组,然后进行进一步分析,比如求分组的数量,分组内的最大值最小值平均值等。在sql中,就是大名鼎鼎的groupby操作。pandas中,也有对应的groupby操作,下面我们就来看看pandas中的groupby怎么使用。2.groupby的数据结构首先我们看如下代码defddd():levels=[“L1″,”L1″,”L1″,”L2″,”L2″,”L3”,

大家好,又见面了,我是你们的朋友全栈君。

项目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://javaforall.net/146270.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月13日 下午11:20
下一篇 2022年5月13日 下午11:20


相关推荐

  • 第46章 执行数据库恢复

    第46章 执行数据库恢复

    2021年6月10日
    98
  • 新建一个vue项目[通俗易懂]

    新建一个vue项目[通俗易懂]1.npm install -g vue-cli2.vue init webpack demo1demo1自定义项目名称创建成功后可以在目录下看到文件夹3.static文件夹用于存放一些静态资源,如图片图标等4. 组件存放在src/components文件夹中5.配置路由 ①package.json里查看”dependencies”是否有:”vue-router”: “^3.0.1″,没有就加上去 ②”src”目录下main.js是否引入路由,没有就加上 …

    2022年8月18日
    8
  • matlab中的tic toc的用法

    matlab中的tic toc的用法tic 和 toc 用来记录 matlab 命令执行的时间 tic 用来保存当前时间 而后使用 toc 来记录程序完成时间 两者往往结合使用 用法如下 程序代码 tic 任意表达式 t toc 显示时间单位 秒

    2026年3月16日
    3
  • Python学习(十一)Python标识符命名规范

    Python学习(十一)Python标识符命名规范简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python中标识符的命名不是随意的,而是要遵守一定的命令规则,比如说:1.标识符是由字符(A~Z和a~z)、下划线和数字组成,但第一个字符不能是数字。2.标识符不能和Python中的保留字相同。有关保留字,后续章节会详细介绍。3.Python中的标…

    2025年10月15日
    4
  • 双峰阈值法

    双峰阈值法概念 1996 年 Prewitt 提出了直方图双峰法 即如果灰度级直方图呈明显的双峰状 则选取两峰之间的谷底所对应的灰度级作为阈值 横坐标是图像中各像素点的灰度级 纵坐标是具有该灰度级 像素值 的像素个数 它认为图像由前景和背景组成 在灰度直方图上 前后二景都形成高峰 在双峰之间的最低谷处就是图像的阈值所在 例子 注意 X 轴是灰度值 Y 轴是该灰度值的像素点个数 1 初始化 假设我现在有一张图片的灰度直方图如下 初始化双峰 V1 0 30 V2 255 30 初始化阈值为 th 127 此

    2026年3月26日
    3
  • git 本地分支切换远程分支_git看不到远程分支

    git 本地分支切换远程分支_git看不到远程分支gitcheckout-bxxx{{本地建立的分支}}origin/xxxx{{远端的分支,一定要记得加origin}}———–遇到的坑是:先拉取的master分支代码,然后再在仓库建立的分支,所以需要先在本地进行“gitpull”代码以后,”gitbranch-r”才能看到新建立的分支!!…

    2025年12月1日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号