Pandas DataFrame 数据聚合:高效计算分组百分比

pandas dataframe 数据聚合:高效计算分组百分比

本文旨在介绍如何使用 Pandas DataFrame 对数据进行分组聚合,并计算特定列的百分比。我们将通过一个实际案例,演示如何按设备 (Device) 对带宽使用情况 (Bw_in, Bw_out) 进行汇总,并计算其占总流量 (In, Out) 的百分比,从而高效地实现数据分析目标。

使用 groupby() 和 transform() 进行数据聚合

在 Pandas 中,groupby() 函数允许你根据一个或多个列的值将 DataFrame 分组。然后,你可以对每个组应用聚合函数,例如 sum()、mean()、count() 等。 transform() 函数则允许我们将聚合后的值广播回原始 DataFrame,这对于计算百分比等需要比较每个组内值与组总和的情况非常有用。

示例:

假设我们有以下 DataFrame:

import pandas as pddata = {'Device': ['Usa123', 'Usa123', 'Emea01', 'Emea01'],        'int': ['Eth1', 'Eth0', 'Wan1', 'Eth3'],        'In': [1000, 10000, 1000, 2000],        'Out': [500, 700, 500, 1000],        'Bw_in': [100, 200, 150, 200],        'Bw_out': [75, 80, 90, 70]}df = pd.DataFrame(data)print(df)

输出:

  Device   int     In   Out  Bw_in  Bw_out0  Usa123  Eth1   1000   500    100      751  Usa123  Eth0  10000   700    200      802  Emea01  Wan1   1000   500    150      903  Emea01  Eth3   2000  1000    200      70

现在,我们要计算每个设备的 %InUsage 和 %OutUsage,计算公式如下:

%InUsage = Bw_in 总和 / In 总和 (按设备分组)%OutUsage = Bw_out 总和 / Out 总和 (按设备分组)

我们可以使用以下代码实现:

g = df.groupby("Device")df[["%InUsage", "%OutUsage"]] = (    g[["Bw_in", "Bw_out"]].transform("sum")    / g[["In", "Out"]].transform("sum").to_numpy())print(df)

代码解释:

g = df.groupby(“Device”): 这行代码根据 ‘Device’ 列对 DataFrame 进行分组,并将分组后的对象存储在变量 g 中。g[[“Bw_in”, “Bw_out”]].transform(“sum”): 这行代码对每个设备组的 ‘Bw_in’ 和 ‘Bw_out’ 列求和。transform(“sum”) 函数将计算得到的每个组的总和广播回原始 DataFrame,保持与原始 DataFrame 相同的索引。g[[“In”, “Out”]].transform(“sum”).to_numpy(): 这行代码对每个设备组的 ‘In’ 和 ‘Out’ 列求和,然后使用 .to_numpy() 将结果转换为 NumPy 数组。 这是因为 Pandas Series 和 DataFrame 在进行除法运算时,会进行索引对齐。为了避免索引对齐带来的潜在问题,我们将除数转换为 NumPy 数组。df[[“%InUsage”, “%OutUsage”]] = …: 这行代码将计算得到的 %InUsage 和 %OutUsage 添加到原始 DataFrame 中。

输出结果:

  Device   int     In   Out  Bw_in  Bw_out  %InUsage  %OutUsage0  Usa123  Eth1   1000   500    100      75  0.027273   0.1291671  Usa123  Eth0  10000   700    200      80  0.027273   0.1291672  Emea01  Wan1   1000   500    150      90  0.116667   0.1066673  Emea01  Eth3   2000  1000    200      70  0.116667   0.106667

注意事项

确保用于分组的列(例如,这里的 ‘Device’)包含正确的数据类型。在进行除法运算时,要处理除数为零的情况,避免出现 ZeroDivisionError。 可以使用 fillna(0) 将 NaN 值替换为 0。理解 transform() 函数的作用,它将聚合结果广播回原始 DataFrame,这使得我们可以方便地进行后续计算。使用 .to_numpy() 将 Pandas Series 转换为 NumPy 数组,避免索引对齐问题,提高代码的健壮性。

总结

本文介绍了如何使用 Pandas 的 groupby() 和 transform() 函数对 DataFrame 进行分组聚合,并计算特定列的百分比。通过示例代码和详细解释,展示了如何高效地处理数据,并获得所需的结果。 这种方法避免了使用 apply 函数,从而提高了代码的执行效率。 掌握这些技巧可以帮助你更好地进行数据分析和处理。

以上就是Pandas DataFrame 数据聚合:高效计算分组百分比的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1370104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 10:14:42
下一篇 2025年12月14日 10:14:58

相关推荐

  • 高效 Pandas 数据聚合:计算分组百分比利用率

    本文旨在介绍如何使用 Pandas 库高效地对 DataFrame 进行分组聚合,并计算特定指标的百分比利用率。通过 groupby() 和 transform() 方法,避免使用低效的 apply() 函数,实现更快速、简洁的数据处理。我们将以计算设备带宽利用率为例,演示具体操作步骤和代码示例。 …

    好文分享 2025年12月14日
    000
  • functools 模块中的 lru_cache 和 wraps

    lru_cache通过缓存函数结果提升性能,wraps保留被装饰函数的元信息以确保代码可维护性。两者在优化与调试中互补使用,适用于递归、I/O操作等重复计算场景,且需合理配置maxsize和typed参数以平衡性能与内存开销。 functools 模块中的 lru_cache 和 wraps 是Py…

    2025年12月14日
    000
  • 如何使用虚拟环境(Virtualenv)?

    虚拟环境能解决依赖冲突,通过为每个Python项目创建独立环境,实现库和解释器的隔离,避免版本冲突,确保项目间互不干扰。 虚拟环境(Virtualenv)是Python开发中一个非常基础但极其重要的工具,它允许你为每个项目创建独立的Python运行环境,从而有效地隔离不同项目所需的库和依赖,彻底解决…

    2025年12月14日
    000
  • 使用 FastAPI 上传图片并传递给 YOLOv8 模型

    本文档旨在指导开发者如何使用 FastAPI 框架构建一个 REST API 接口,该接口能够接收图片上传,并将图片数据传递给 YOLOv8 模型进行处理。我们将重点介绍如何处理上传的图片文件,并将其转换为 YOLOv8 模型能够接受的格式,解决直接传递字节数据导致的 “Unsuppor…

    2025年12月14日
    000
  • 将十六进制文本转换为指定 JSON 格式的教程

    本文档旨在指导开发者如何使用 Python 将包含十六进制数据的文本文件转换为特定格式的 JSON 文件。该过程涉及读取文本文件,解析十六进制数据,将其转换为十进制,并最终以指定的 JSON 结构输出。通过本文,你将学习如何使用正则表达式提取数据,以及如何构建符合要求的 JSON 结构。 1. 理解…

    2025年12月14日
    000
  • 如何使用collections模块中的常用数据结构(defaultdict, Counter, deque)?

    defaultdict、Counter和deque是Python collections模块中高效处理数据分组、计数和双端操作的工具。defaultdict通过自动初始化缺失键提升代码简洁性与效率;Counter专用于可哈希对象的频率统计,提供most_common等便捷方法,适合大数据计数但需注意…

    2025年12月14日
    000
  • Django 中的中间件(Middleware)及其作用

    Django中间件在请求-响应周期中扮演关键角色,它在请求到达视图前和响应返回客户端前进行全局处理,支持认证、安全、日志等跨领域功能。通过自定义中间件类并注册到MIDDLEWARE列表,开发者可灵活插入逻辑,实现如IP限制、性能监控等功能。其执行顺序遵循配置列表,请求正序、响应倒序,且可通过返回Ht…

    2025年12月14日
    000
  • 将十六进制文本转换为特定JSON格式的Python教程

    本文将介绍如何使用Python将包含十六进制数据的文本文件转换为特定格式的JSON文件。我们将首先解析文本文件,提取相关信息,然后将十六进制数据转换为十进制,最后按照预定的JSON结构进行组织和输出。 准备工作 在开始之前,请确保你已经安装了Python环境。本教程使用Python 3.x版本。你还…

    2025年12月14日
    000
  • 将十六进制数据转换为特定JSON格式的教程

    本文档旨在指导读者如何使用Python将包含十六进制数据的文本文件转换为特定格式的JSON文件。我们将使用正则表达式解析文本,并将十六进制值转换为十进制,最终生成符合要求的JSON结构。本教程提供详细的代码示例和解释,帮助读者理解转换过程并应用于实际场景。 1. 理解数据格式 首先,我们需要理解输入…

    2025年12月14日
    000
  • if __name__ == ‘__main__’ 的作用是什么?

    if name == ‘__main__’: 用于判断Python文件是否作为主程序运行,确保其下的代码仅在直接执行时触发,而被导入时不执行。它保障了代码的模块化与复用性,避免导入时意外执行主逻辑、测试代码或命令行解析,防止副作用。典型用法是将主逻辑封装在main()函数中,…

    2025年12月14日
    000
  • 如何理解Python的enum模块(枚举)?

    Python的enum模块通过创建枚举类将相关常量组织为类型安全的成员,每个成员具有唯一身份、可迭代且支持名称与值访问;相比传统魔术字符串或数字常量,enum提供强类型检查、防止拼写错误、提升可读性与维护性;结合auto()可自动生成值,Flag类支持位运算组合状态;序列化时需转换为值或名称以兼容J…

    2025年12月14日
    000
  • Python列表推导式:高效生成复杂序列的两种策略

    本文探讨了如何使用Python列表推导式生成累积或具有特定数学模式的序列。介绍了利用赋值表达式(海象运算符:=)在推导式中维护状态的方法,以及通过识别序列的数学规律来直接构建推导式的优化策略,旨在提升代码的简洁性和效率。 在python编程中,列表推导式(list comprehension)是一种…

    2025年12月14日
    000
  • 如何发布一个自己的Python包到PyPI?

    答案:发布Python包需准备pyproject.toml(定义元数据和依赖)、README.md(项目说明)、LICENSE(授权条款)、__init__.py(声明包)和.gitignore(忽略无关文件),并通过build构建分发文件、twine上传至PyPI或TestPyPI测试,确保包可安…

    2025年12月14日
    000
  • Python有哪些常用的内置数据类型?

    Python常用内置数据类型包括:整数(int)、浮点数(float)、复数(complex)、字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set)、布尔值(bool)和空值(None)。这些类型分为可变(如list、dict、set)和不可变(如int、floa…

    2025年12月14日
    000
  • 利用 JAX vmap 高效并行化模型集成推理:解决参数结构不一致问题

    本文旨在解决JAX中并行化模型集成推理时遇到的jax.vmap参数结构不一致错误。核心问题在于vmap直接操作数组轴而非Python列表。通过将“结构列表”模式转换为“结构化数组”模式,即使用jax.tree_map和jnp.stack将多个模型的参数堆叠成单个PyTree,可以有效解决此问题,实现…

    2025年12月14日
    000
  • Python列表推导式高级技巧:巧用赋值表达式与数学公式生成复杂序列

    本文深入探讨了如何利用Python列表推导式高效生成具有累进或复杂数学模式的序列。我们将介绍两种主要方法:一是通过Python 3.8引入的赋值表达式(Walrus运算符:=)在推导式内部维护和更新状态;二是通过识别序列的潜在数学规律,直接构建简洁高效的生成逻辑。通过具体示例,读者将掌握在不同场景下…

    2025年12月14日
    000
  • 如何理解Python的“一切皆对象”?

    Python中“一切皆对象”意味着所有数据都是某个类的实例,拥有属性和方法,包括数字、函数、类和模块,变量通过引用指向对象,带来统一的API、动态类型和引用语义,但也需注意可变对象共享、默认参数陷阱及性能开销。 理解Python的“一切皆对象”其实很简单:在Python的世界里,你所接触到的一切——…

    2025年12月14日
    000
  • 如何删除列表中的重复元素?

    答案:Python中去重常用set、dict.fromkeys()和循环加辅助集合;set最快但无序,dict.fromkeys()可保序且高效,循环法灵活支持复杂对象去重。 删除列表中的重复元素,在Python中我们通常会利用集合(set)的特性,或者通过列表推导式、循环遍历等方式实现。每种方法都…

    2025年12月14日
    000
  • 使用列表推导式生成特定数列的技巧与实践

    本文探讨了如何利用Python列表推导式高效生成特定数值序列[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]。教程详细介绍了两种主要方法:一是通过赋值表达式(海象运算符:=)在推导式内部实现累加逻辑;二是识别数列背后的数学模式,将其转化为简洁的数学公式,从而避免状态管理,实…

    2025年12月14日
    000
  • Python中的日志模块(logging)如何配置和使用?

    Python的logging模块通过日志器、处理器、格式化器和过滤器实现灵活的日志管理,支持多级别、多目的地输出,相比print()具有可配置性强、格式丰富、线程安全等优势,适用于复杂项目的日志需求。 Python的 logging 模块是处理程序运行信息的核心工具,它允许你以灵活的方式记录各种事件…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信