新闻中心

使用Pandas DataFrame高效执行多列算术运算

2025-11-23
浏览次数:
返回列表

使用pandas dataframe高效执行多列算术运算

本文旨在探讨在Pandas DataFrame中对多列进行加减法运算的两种高效方法。我们将介绍如何利用`DataFrame.eval()`进行多行表达式计算,以及如何通过链式调用`add()`和`sub()`方法实现向量化操作。通过具体示例,读者将掌握在Python环境中简洁、高效地处理DataFrame列间复杂算术逻辑的技巧,从而提升数据处理效率和代码可读性。

在数据分析和处理中,我们经常需要对Pandas DataFrame中的多个列执行一系列算术运算。当这些运算模式相似且涉及多个目标列时,寻找一种简洁高效的方法至关重要。本教程将详细介绍两种实现这一目标的策略:使用DataFrame.eval()进行多行表达式求值,以及利用Pandas的向量化方法add()和sub()。

1. 数据准备

首先,我们创建一个示例DataFrame,作为后续操作的基础。

import pandas as pd

data = {
  "A": [42, 38, 39, 23],
  "B": [45, 30, 15, 65],
  "C": [60, 50, 25, 43],
  "D": [12, 70, 35, 76],
  "E": [87, 90, 45, 43],
  "F": [40, 48, 55, 76],
  "G": [58, 42, 85, 10],
}
df = pd.DataFrame(data)

print("原始DataFrame:")
print(df)

我们的目标是针对列 C, D, E,执行相同的运算逻辑:目标列 = 目标列 - B + A。

2. 方法一:使用 DataFrame.eval() 进行多行表达式求值

DataFrame.eval() 方法允许用户以字符串形式传递表达式,Pandas 会在 DataFrame 的上下文中对这些表达式进行求值。对于需要对多个列执行相同或相似操作的场景,eval() 特别有用,因为它支持多行表达式,从而提高了代码的清晰度。

df_eval = df.copy() # 创建副本,避免修改原始df
df_eval = df_eval.eval('''
C = C - B + A
D = D - B + A
E = E - B + A
''')

print("\n使用 eval() 后的DataFrame:")
print(df_eval)

优点:

  • 可读性强: 表达式直接反映了数学逻辑,易于理解。
  • 简洁: 可以在一个方法调用中处理多个列的更新。
  • 性能: 对于大型DataFrame,eval() 通常比纯Python循环更快,因为它在C层级进行优化。

注意事项:

  • 表达式字符串需要严格遵循Python语法,且只能引用DataFrame中的列名。
  • eval() 默认会修改DataFrame的副本并返回,如果需要原地修改,可以考虑inplace=True参数(但通常不推荐,因为会使链式操作复杂化)。

3. 方法二:使用向量化操作 add() 和 sub()

Pandas 提供了高度优化的向量化方法,如 add()、sub()、mul()、div() 等,它们能够对整个 Series 或 DataFrame 执行元素级的运算,而无需显式循环。对于本例中的模式 目标列 = 目标列 - B + A,我们可以将其分解为 目标列 = 目标列 + (A - B)。

网趣网上购物系统HTML静态版 网趣网上购物系统HTML静态版

网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使

网趣网上购物系统HTML静态版 0 查看详情 网趣网上购物系统HTML静态版
df_vec = df.copy() # 创建副本
# 首先计算 (A - B) 的结果,这是一个 Series
intermediate_result = df_vec['A'].sub(df_vec['B'])

# 然后将这个 Series 加到目标列 C, D, E 上
# 注意:当将一个 Series 加到一个 DataFrame 的子集时,
# Pandas 会根据索引对齐,并广播 Series 的值到每一行。
# 明确指定 axis=0 确保按行进行操作(即 Series 的每个值对应 DataFrame 的一行)
df_vec[['C', 'D', 'E']] = df_vec[['C', 'D', 'E']].add(intermediate_result, axis=0)

print("\n使用向量化操作后的DataFrame:")
print(df_vec)

优点:

  • 极致性能: Pandas 的核心优势之一,这些方法在底层C/Cython实现,速度非常快,尤其适用于大型数据集。
  • Pandas 惯用法: 这种链式调用和向量化思维是Pandas数据处理的推荐方式。
  • 灵活性: 可以通过 axis 参数控制操作的方向(行或列)。

注意事项:

  • 理解 axis 参数对于正确执行操作至关重要。axis=0 表示按行操作(或沿索引方向),axis=1 表示按列操作(或沿列方向)。
  • 当操作涉及不同维度的数据(如 DataFrame 和 Series)时,Pandas 会尝试进行对齐和广播。确保这种行为符合预期。

4. 结果验证

无论是使用 eval() 还是向量化方法,最终的输出结果都应该是一致的:

    A   B   C   D   E   F   G
0  42  45  57   9  84  40  58
1  38  30  58  78  98  48  42
2  39  15  49  59  69  55  85
3  23  65   1  34   1  76  10

可以看到,列 C, D, E 都按照 目标列 = 目标列 - B + A 的逻辑进行了更新。

5. 总结与最佳实践

在Pandas DataFrame中对多列执行批量算术运算时,DataFrame.eval() 和链式向量化方法都是强大的工具。

  • 选择 eval() 的场景:
    • 当表达式逻辑复杂,且涉及多个列的更新时,eval() 的多行字符串形式能提供更好的可读性。
    • 当表达式可以直接引用DataFrame中的列名,并且表达式本身比较长或包含多个中间步骤时。
  • 选择向量化操作的场景:
    • 当操作模式相对简单,可以分解为一系列 add(), sub(), mul() 等方法链式调用时。
    • 追求极致性能,并且熟悉Pandas的向量化操作原理时。
    • 当需要更细粒度地控制对齐和广播行为时。

在实际开发中,通常会根据具体情况和团队的代码风格偏好来选择。对于大多数日常任务,两种方法都能提供高效且可读的解决方案。建议优先考虑向量化操作,因为它更符合Pandas的设计哲学,并且在性能上通常表现更优。然而,对于涉及大量临时变量或复杂条件逻辑的表达式,eval() 的简洁性可能更具吸引力。

以上就是使用Pandas DataFrame高效执行多列算术运算的详细内容,更多请关注其它相关文章!


# 因为它  # 抖音没有营销推广平台  # 瑞金seo优化招商  # 吉安德阳网站建设  # 邯郸seo推广价格如何  # 衡阳网站建设优惠  # 河南seo公司获客软件  # 网站运营推广招聘要求  # 赣州网站优化简历ppt  # 葫芦岛企业网站优化选择  # 怀化网站建设咨询  # 淘宝  # python  # 更快  # 数据处理  # 网上  # 中对  # 两种  # 购物系统  # 多个  # 链式  # 代码可读性  # 工具 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  韩小圈电脑版在线入口_网页版免费登录地址  iwriter统一登录平台 iwrite账号密码登录页面  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  自定义Bag-of-Words实现:处理带负号的词汇权重  c++ 命名空间怎么用 c++ namespace使用指南  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  steam官方入口大全 steam账号注册及操作指南  在Socket.IO连接中实现Access Token自动更新与动态重连  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  一加 14R 快充无反应_一加 14R 充电优化  微信商城在哪里打开【步骤】  机器学习中对数变换预测结果的反向还原  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  msn官网入口地址手机版 msn官方网站手机最新链接  如何仅使用CSS更改登录界面背景图像图标的颜色  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  怎么在mac上运行html代码_mac运行html代码方法【指南】  Fabric模组开发:自定义物品与物品组的现代管理方法  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  探索高级语言到原生C/C++的转译:挑战与内存管理策略  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  可靠CSGO开箱平台解析 CSGO开箱网合集  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  J*aScript实现单选按钮与关联输入框的联动禁用教程  漫蛙网页登录入口 漫蛙漫画官方授权网址  铃兰之剑为这和平的世界希里技能组及加点推荐  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  C#中解析不规范的HTML为XML 常见的坑与解决办法  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  Golang如何使用net/url解析URL_Golang URL解析与处理方法  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  如何在CSS中使用浮动制作导航栏_float实现水平菜单  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  DLsite中文平台入口 DLsite官网内容在线查看  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​ 

搜索