新闻中心
Python Pandas DataFrame多列批量加减运算的高效实现指南

本文深入探讨了在pandas dataframe中高效执行多列批量加减运算的两种核心方法。我们将详细介绍如何利用`dataframe.eval()`实现简洁的多行表达式计算,以及如何通过链式调用`add()`和`sub()`方法进行高度矢量化的操作。通过这两种策略,开发者可以显著提升数据处理效率,优化代码结构,并确保操作的准确性。
1. 引言:DataFrame多列运算的常见需求
在数据分析和处理中,我们经常需要对Pandas DataFrame中的多个列执行相似的算术运算。例如,可能需要将某个基准列的值应用于一系列目标列,进行加、减、乘、除等操作。手动逐列编写代码虽然可行,但当目标列数量较多时,会导致代码冗长、难以维护且效率低下。本教程将介绍两种简洁而高效的方法来解决这一问题。
2. 准备示例数据
首先,我们创建一个示例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)原始DataFrame:
A B C D E F G 0 42 45 60 12 87 40 58 1 38 30 50 70 90 48 42 2 39 15 25 35 45 55 85 3 23 65 43 76 43 76 10
假设我们的目标是:将列C、D、E的每个值,先减去对应行B列的值,然后再加上对应行A列的值。即,对于列X (C, D, E),执行 df['X'] = df['X'] - df['B'] + df['A']。
3. 方法一:使用 DataFrame.eval() 进行多行表达式计算
DataFrame.eval() 方法允许用户以字符串形式传递表达式,并在DataFrame的上下文中执行。它特别适用于涉及多个列的复杂表达式,并且可以接受多行表达式,从而一次性更新多个列。
工作原理:eval() 将字符串表达式解析为DataFrame的操作。当表达式以列名作为左值时,eval() 会直接更新该列。其优点在于语法直观,类似于直接在Python中编写数学公式,对于涉及多个变量的运算尤其方便。
示例代码:
# 方法一:使用 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)输出结果:
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
注意事项:
- eval() 在处理大型DataFrame时通常比纯Python循环更快,因为它在C语言级别执行操作。
- 表达式中的列名可以直接引用,无需使用 df['column'] 语法。
- 对于非常复杂的、需要动态生成表达式的场景,eval() 可能会非常有用。
4. 方法二:链式调用 add() 和 sub() 实现矢量化操作
Pandas提供了丰富的矢量化方法,如 add(), sub(), mul(), div() 等,它们可以直接应用于DataFrame或Series,并自动进行索引对齐。这种方法通常是处理大型数据集时性能最优的选择。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
工作原理: 本例中的操作 X - B + A 可以分解为 X + (A - B)。我们可以先计算公共部分 (A - B),然后将其一次性添加到目标列 C, D, E 上。DataFrame.add() 和 DataFrame.sub() 方法允许指定 axis 参数,以控制操作是按行(axis=0)还是按列(axis=1)进行。
示例代码:
# 方法二:链式调用 add() 和 sub()
df_vectorized = df.copy() # 创建副本
# 计算共同的偏移量:A - B
offset = df_vectorized['A'].sub(df_vectorized['B'])
# 将偏移量应用到目标列 C, D, E
# 注意:这里add方法默认按索引对齐,由于offset是一个Series,
# 且目标是DataFrame的子集,会按行进行广播。
df_vectorized[['C', 'D', 'E']] = df_vectorized[['C', 'D', 'E']].add(offset, axis=0)
print("\n使用矢量化操作后的DataFrame:")
print(df_vectorized)输出结果:
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
注意事项:
- 这种方法通常是Pandas中性能最好的方案,因为它充分利用了底层C优化。
- axis=0 表示按行操作(或沿索引方向),当将一个Series与DataFrame进行算术运算时,Series的索引会与DataFrame的行索引对齐。
- 对于所有目标列都应用相同偏移量的场景,矢量化操作的代码更为简洁高效。
5. 总结与选择建议
在Pandas DataFrame中对多列执行批量加减运算时,DataFrame.eval() 和链式矢量化方法都是非常有效的工具。
-
DataFrame.eval():
- 优点:语法直观,适合表达复杂的、多行的、涉及多个列的公式。当表达式逻辑本身较为复杂时,eval() 的可读性可能更高。
- 缺点:对于非常简单的操作,或者需要极致性能的场景,可能不如纯矢量化操作快。
-
链式矢量化操作(如 add(), sub()):
- 优点:性能卓越,是处理大型数据集的首选。充分利用了Pandas的底层优化,代码执行效率高。
- 缺点:对于特别复杂的组合运算,可能需要分解成多步,代码逻辑不如 eval() 那样一气呵成。
选择建议:
- 如果你的运算逻辑相对简单,且需要最大化性能,尤其是在所有目标列都应用相同转换因子时,优先选择矢量化操作。
- 如果你的运算逻辑包含多个步骤、多个变量,并且你希望代码更接近数学公式的表达方式,eval() 提供了一个非常清晰且高效的替代方案。
掌握这两种方法,将使你在处理Pandas DataFrame中的批量列运算时更加游刃有余,写出更高效、更易读的代码。
以上就是Python Pandas DataFrame多列批量加减运算的高效实现指南的详细内容,更多请关注其它相关文章!
# 偏移量
# seo推广考核
# 华为网站建设评价在哪
# 江西抖音搜索排名关键词
# 来凤网站推广怎么做
# 焦作网站关键词优化工具
# SEO入门微单平价新手
# 天津推广网站建设有哪些
# 抖音店铺该怎么营销推广
# 昆明网站建设如何做好
# 保税区网站推广费用
# 这两种
# python
# 充分利用
# 应用于
# 可以直接
# 两种
# 加减
# 矢量化
# 多个
# 链式
# 工具
# c语言
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Eclipse怎么运行工程_Eclipse工程运行配置说明
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
J*aScript中安全有效地处理localStorage字符串数据
c++ dfs和bfs代码 c++深度广度优先搜索算法
uc浏览器网页版入口 uc浏览器网页版最新网址
如何在 Windows 11 中启动游戏手柄设置
必由学在线入口 必由学网页版快速登录入口
Python多版本共存与虚拟环境管理深度指南
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
HTML长属性值处理:表单action路径优化与代码规范应对
必由学官方平台入口 必由学在线课堂登录地址
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
如何在网页中实现特定地点的随机图片展示
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
响应式容器内容自动缩放与宽高比维持教程
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
R星幕后开发视频泄露 包含《GTA6》等多款大作
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
12306选座怎么选到商务座_12306商务座选择与配置说明
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
微信网页版登录教程_微信网页版登录入口在哪
蛙漫官方正版入口 蛙漫网页在线全集免费观看
必由学登录入口 必由学官方网站在线访问链接
Lar*el递归关系中排除子孙节点的策略
zookeeper 都有哪些功能?
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
qq游戏大厅官方下载_qq游戏免费下载安装入口
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
Mac怎么查看崩溃日志_Mac控制台错误报告分析
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
ACG动漫视频网入口 ACG动漫*免费正版观看地址
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
批改网学生版PC登录 批改网官网登录系统入口
BetterDiscord插件中安全更新用户简介的实践指南
J*aScript数组对象转换:按指定键分组与值收集
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
J*a实现学校排课程序_面向对象结构化项目示例
J*a应用集成GitHub CLI与API认证指南
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版


2025-11-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)