深入解析 `DataFrame.groupby` 和 `agg` 的用法及使用场景

深入解析 `DataFrame.groupby` 和 `agg` 的用法及使用场景

    • 1. `groupby` 的基本用法
      • 语法:
      • 示例:
    • 2. `agg` 的基本用法
      • 语法:
      • 示例:
    • 3. `first`、`sum`、`lambda` 的用法
      • 3.1 `first`
        • 示例:
      • 3.2 `sum`
        • 示例:
      • 3.3 `lambda`
        • 示例:
    • 4. `reset_index` 的用法
      • 语法:
      • 示例:
    • 5. 综合示例:`groupby` + `agg` 的完整用法
    • 6. 总结

在数据分析和处理中,pandas 是一个非常强大的工具。其中,DataFrame.groupbyagg 是两个常用的功能,它们可以帮助我们对数据进行分组、聚合和转换。本文将详细讲解 groupbyagg 的用法,以及如何结合 firstsumlambdareset_index 来实现复杂的数据处理。


1. groupby 的基本用法

groupbypandas 中用于分组数据的函数。它的核心思想是将数据按照某个或某些列的值进行分组,然后对每个分组进行操作。

语法:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False)
  • by:指定分组的列名或列名列表。
  • as_index:是否将分组列作为索引,默认为 True
  • sort:是否对分组键进行排序,默认为 True

示例:

假设我们有一个包含学生成绩的 DataFrame

import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice'],
    'Subject': ['Math', 'Math', 'Science', 'Science', 'Math'],
    'Score': [85, 90, 88, 92, 95]
}

df = pd.DataFrame(data)
print(df)

输出:

    Name  Subject  Score
0  Alice     Math     85
1    Bob     Math     90
2  Alice  Science     88
3    Bob  Science     92
4  Alice     Math     95

我们可以按照 Name 列进行分组:

grouped = df.groupby('Name')
print(grouped.groups)

输出:

{'Alice': [0, 2, 4], 'Bob': [1, 3]}

2. agg 的基本用法

agggroupby 对象的一个方法,用于对分组后的数据进行聚合操作。它可以接受一个函数、字符串(如 'sum''mean')或字典(指定不同列的聚合方式)。

语法:

DataFrame.groupby(...).agg(func, *args, **kwargs)
  • func:聚合函数,可以是字符串、函数或字典。

示例:

我们继续使用上面的 df,计算每个学生的平均分:

result = df.groupby('Name').agg({'Score': 'mean'})
print(result)

输出:

        Score
Name        
Alice   89.333333
Bob     91.000000

3. firstsumlambda 的用法

agg 中,我们可以使用多种聚合函数来处理数据。以下是常用的几种:

3.1 first

first 用于获取每个分组中第一行的值。

示例:
result = df.groupby('Name').agg({'Subject': 'first', 'Score': 'mean'})
print(result)

输出:

        Subject      Score
Name                      
Alice     Math  89.333333
Bob       Math  91.000000

3.2 sum

sum 用于计算每个分组中数值列的总和。

示例:
result = df.groupby('Name').agg({'Score': 'sum'})
print(result)

输出:

        Score
Name        
Alice     268
Bob       182

3.3 lambda

lambda 是一种匿名函数,可以在 agg 中自定义聚合逻辑。

示例:

假设我们想将每个学生的 Score 转换为字符串,并在前面加上 "Score: "

result = df.groupby('Name').agg({'Score': lambda x: 'Score: ' + str(x.sum())})
print(result)

输出:

                Score
Name                
Alice  Score: 268.0
Bob    Score: 182.0

4. reset_index 的用法

reset_index 用于重置 DataFrame 的索引。当使用 groupbyagg 后,分组列会作为索引,如果需要将其还原为普通列,可以使用 reset_index

语法:

DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
  • drop:是否丢弃索引列,默认为 False

示例:

result = df.groupby('Name').agg({'Score': 'mean'}).reset_index()
print(result)

输出:

    Name      Score
0  Alice  89.333333
1    Bob  91.000000

5. 综合示例:groupby + agg 的完整用法

现在,我们来看一个更复杂的例子,结合 firstsumlambdareset_index 来处理数据。

假设我们有一个包含边信息的 DataFrame

data = {
    'edge_key': ['A', 'A', 'B', 'B', 'C'],
    'source': ['X', 'X', 'Y', 'Y', 'Z'],
    'target': ['P', 'P', 'Q', 'Q', 'R'],
    'text_unit_ids': [[1, 2], [3], [4], [5, 6], [7]],
    'weight': [10, 20, 30, 40, 50],
    'description': ['Edge A', 'Edge A', 'Edge B', 'Edge B', 'Edge C'],
    'human_readable_id': ['A1', 'A2', 'B1', 'B2', 'C1'],
    'id': [1, 2, 3, 4, 5]
}

df = pd.DataFrame(data)
print(df)

输出:

  edge_key source target text_unit_ids  weight description human_readable_id  id
0        A      X      P        [1, 2]      10     Edge A              A1   1
1        A      X      P           [3]      20     Edge A              A2   2
2        B      Y      Q           [4]      30     Edge B              B1   3
3        B      Y      Q        [5, 6]      40     Edge B              B2   4
4        C      Z      R           [7]      50     Edge C              C1   5

我们希望对 edge_key 进行分组,并进行以下操作:

  1. sourcetarget 取第一行的值。
  2. text_unit_ids 合并为一个列表。
  3. weight 求和。
  4. description 拼接为一个字符串。
  5. human_readable_idid 取第一行的值。

代码如下:

def _aggregate_text_unit_ids(x):
    return [item for sublist in x for item in sublist]

def _add_quotes(s):
    return f'"{s}"'

updated_edges_df = df.groupby('edge_key').agg(
    source=('source', 'first'),
    target=('target', 'first'),
    text_unit_ids=('text_unit_ids', _aggregate_text_unit_ids),
    weight=('weight', 'sum'),
    description=('description', lambda x: ''.join(x.apply(_add_quotes))),
    human_readable_id=('human_readable_id', 'first'),
    id=('id', 'first'),
).reset_index(drop=True)

print(updated_edges_df)

输出:

  source target text_unit_ids  weight description human_readable_id  id
0      X      P     [1, 2, 3]      30  "Edge A""Edge A"              A1   1
1      Y      Q  [4, 5, 6]       70  "Edge B""Edge B"              B1   3
2      Z      R        [7]       50        "Edge C"              C1   5

6. 总结

通过本文,我们学习了 groupbyagg 的基本用法,以及如何结合 firstsumlambdareset_index 来实现复杂的数据处理。这些功能在数据分析和处理中非常实用,能够帮助我们高效地完成任务。

希望这篇文章能帮助你更好地理解和使用 groupbyagg。如果你有任何问题或想了解更多,欢迎在评论区留言!

Happy Coding! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git(11)之log显示支持中文

Git(11)之log显示支持中文 Author:Once Day Date:2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档:GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…

代理模式(JDK,CGLIB动态代理,AOP切面编程)

代理模式是一种结构型设计模式,它通过一个代理对象作为中间层来控制对目标对象的访问,从而增强或扩展目标对象的功能,同时保持客户端对目标对象的使用方式一致。 代理模式在Java中的应用,例如 1.统一异常处理 2.Mybatis使用代理 3.Spring…

猪猪软件库

猪猪软件库,汇聚各类宝藏软件,宛如一座数字百宝箱。这里涵盖了实用工具、趣味游戏、高效办公软件等丰富资源,满足不同用户的多样需求。界面简洁直观,搜索便捷流畅,能让你迅速定位心仪软件。 所有资源都经过严格筛选&a…

端到端自动驾驶大模型:视觉-语言-动作模型 VLA

模型框架定义、模型快速迭代能力是考查智驾团队出活能力的两个核心指标。在展开讨论Vision-Language-Action Models(VLA)之前,咱们先来讨论端到端自动驾驶大模型设计。 目录 1. 端到端自动驾驶大模型设计 1.1 模型输入设计 1.2 模型输出设计 1.3 实现难点分析 …

Swin transformer 论文阅读记录 代码分析

该篇文章,是我解析 Swin transformer 论文原理(结合pytorch版本代码)所记,图片来源于源paper或其他相应博客。 代码也非原始代码,而是从代码里摘出来的片段,配上简单数据,以便理解。 当然&…

LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读

LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读 导读:这篇论文提出了一种名为rStar的自我博弈互推理方法,用于增强小型语言模型 (SLMs) 的推理能力,无需微调或依赖更强大的模型。rStar…

CS 144 check5: down the stack (the network interface)

Lectures Note 略 Exercises TCP片段传输到对等方的过程: TCP-in-UDP-in-IP. Linux 提供了一种接口(即“数据报套接字”,UDPSocket),它允许应用程序仅提供用户数据报的有效载荷和目标地址,而内核则负责…

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高

《港湾商业观察》施子夫 12月13日,深圳市越疆科技股份有限公司(以下简称,越疆科技,02432.HK)发布全球发售公告,公司计划全球发售4000万股股份,其中3800万股国际发售,200万股香港公开…

微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用

目录 画板创建canvas绘制及渲染画笔粗细功能实现画笔颜色选择画笔痕迹撤回、板擦、画布清空canvas解析微信小程序中 canvas 的应用场景canvas 与 2D 上下文、webgl 上下文的关系图像的加载与绘制说明代码说明画板创建 canvas绘制及渲染 在wxml添加对应的canvas标签代码,并在j…

混合精度训练说明

什么是混合精度训练?混合精度训练有什么用? 这里总结一下。 本文总结自kapathy的build gpt2 通常在训练过程中,model里面的数据默认都是torch.float32类型, 也就是用32bit的float型数据表示变量。 比如特征提取中提取的特征&…

draw.io 导出svg图片插入word后模糊(不清晰 )的解决办法

通常我们将图片从draw.io导出为svg格式后插入word, 会发现字体不清晰,特别是使用宋体时,折腾了半天,得到如下办法: 方法1: 在draw.io中导出pdf文件,使用 PDF转SVG转换器 - SVGConverter 将其转换为svg, 完美呈现。 …

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…

【动手学运动规划】 5.2 数值优化基础:梯度下降法,牛顿法

朕四季常服, 不过八套. — 大明王朝1566 道长 🏰代码及环境配置:请参考 环境配置和代码运行! 上一节我们介绍了数值优化的基本概念, 让大家对最优化问题有了基本的理解. 那么对于一个具体的问题, 我们应该如何求解呢? 这一节我们将介绍几个基本的求解…

24-12-22 pytorch学习 基础知识 帝乡明日到,犹自梦渔樵。

文章目录 pytorch学习 基础知识pytorch学习(1) Tensors1.1 初始化Tensor1.2 Tensor 的属性1.3 Tensors 的操作1.4 与 NumPy 的桥梁1.4.1 Tensor 到 NumPy 数组1.4.2 NumPy 数组 到 Tensor pytorch学习(2) 数据集和数据加载器2.1 加载一个数据集2.2 迭代和可视化数据集2.3 为你的…

Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述准备工作扫描服务端有那些开放端口创建客户端-服务器设置启动服务器和客户端进程双向发送数据保持服务器进程处于活动状态设置最小…

M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务

M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务 论文大纲理解1. 确认目标2. 分析过程(目标-手段分析)核心问题拆解 3. 实…

【102. 二叉树的层序遍历 中等】

题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例…

第四届电气工程与控制科学

重要信息 官网:www.ic2ecs.com 时间:2024年12月27-29日 简介 第四届电气工程与控制科学定于2024年12月27-29日在中国南京召开。主要围绕“电气工程“、”控制科学“、”机械工程“、”自动化”等主题展开,旨在为从电…

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入,信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具,在汽车制造行业中发挥着重要作用。本文将结合…