当前位置:首页 > 文章列表 > 文章 > python教程 > Pandas多列批量运算优化技巧

Pandas多列批量运算优化技巧

2025-12-07 09:45:32 0浏览 收藏
推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《Pandas DataFrame多列批量运算优化方法》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

Pandas DataFrame:优化多列批量加减运算

本教程详细介绍了在Pandas DataFrame中对多列执行批量加减运算的两种高效方法。我们将探讨如何利用`DataFrame.eval()`进行多行表达式求值,以及如何通过链式调用`add()`和`sub()`方法结合向量化操作实现相同效果。文章将提供详细的代码示例和解释,帮助读者根据具体场景选择最合适的策略,从而提升数据处理效率和代码可读性。

引言:DataFrame多列批量运算挑战

在数据分析和处理中,我们经常需要对Pandas DataFrame中的多个列执行相同的算术运算。例如,可能需要将某个基准列的值从一组目标列中减去,然后再加上另一个参考列的值。手动逐列编写这样的操作(如 df['C'] = df['C'] - df['B'] + df['A'],然后对 D 和 E 重复)不仅冗长,而且效率低下,尤其当涉及的列数很多时。本教程将介绍两种更优雅、更高效的解决方案,帮助您简化代码并提升性能。

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

DataFrame.eval() 方法允许您使用字符串表达式对DataFrame进行计算,其语法更接近数学表达式,并且可以处理多行表达式,从而实现对多列的批量操作。对于复杂的、涉及多个列的运算,eval() 提供了一种简洁且可读性强的解决方案。

示例代码

假设我们有一个DataFrame df,需要将列 C, D, E 分别减去 B 列的值,然后加上 A 列的值。

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)

# 使用eval()进行批量操作
df_eval = df.copy() # 创建副本以避免修改原始DataFrame
df_eval = df_eval.eval('''C = C - B + A
D = D - B + A
E = E - B + A
''')

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

解释

eval() 方法接受一个多行字符串作为参数,其中每一行代表一个赋值表达式。在表达式中,您可以直接引用DataFrame的列名,eval() 会自动识别并将其视为Series对象进行计算。这种方法在内部利用NumExpr库进行优化,对于大型数据集可以提供显著的性能提升。它将多个独立的赋值操作合并为一个高效的内部计算过程。

方法二:利用链式 add() 和 sub() 进行向量化操作

Pandas的Series和DataFrame对象支持向量化操作,这意味着您可以对整个列或DataFrame执行算术运算,而无需编写显式的循环。通过链式调用 add() 和 sub() 等方法,我们可以构建出高效且表达力强的批量操作。这种方法特别适用于当多个目标列需要应用相同的偏移量或变换时。

示例代码

我们将使用与上述相同的数据集,通过链式方法实现相同的运算。

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:") # 原始DataFrame已在eval示例中打印
# print(df)

# 使用链式add/sub进行批量操作
df_chained = df.copy() # 创建副本以避免修改原始DataFrame

# 计算共同的偏移量:A - B
# df['A'].sub(df['B']) 等同于 df['A'] - df['B']
offset = df_chained['A'].sub(df_chained['B'])

# 将偏移量加到目标列上
# df[['C', 'D', 'E']] 是一个包含目标列的子DataFrame
# .add(offset, axis=0) 将 Series 'offset' 按行(axis=0)广播到子DataFrame的每一列
df_chained[['C', 'D', 'E']] = df_chained[['C', 'D', 'E']].add(offset, axis=0)

print("\n使用链式add/sub后的DataFrame:")
print(df_chained)

解释

这种方法的核心在于利用Pandas的广播机制。首先,我们计算出所有目标列都需要共享的共同偏移量 A - B,这会得到一个Series对象 offset。然后,我们选择目标列 df_chained[['C', 'D', 'E']],并使用 .add() 方法将 offset Series 添加到这些列上。axis=0 参数确保 offset Series 的值按行与目标DataFrame的每一列对齐并相加。这种方式非常直观,且充分利用了Pandas底层的优化,提供了出色的性能。

两种方法的比较与选择

  • DataFrame.eval():
    • 优点: 语法简洁,更接近自然语言或数学表达式,尤其适合处理多行且逻辑复杂的表达式。对于大型DataFrame,它通常能提供更好的性能,因为它利用NumExpr库进行优化。
    • 缺点: 字符串表达式可能在某些情况下难以调试。此外,应避免在eval()中使用不受信任的用户输入,以防潜在的安全风险。
  • 链式 add()/sub():
    • 优点: 代码更具Pandas风格,显式调用方法使得操作流程清晰。对于本例中这种“对多列应用相同操作”的场景,通过计算一个公共偏移量并进行广播,代码简洁高效。易于理解其向量化原理。
    • 缺点: 对于非常复杂的、涉及不同运算逻辑的多列操作,可能需要更复杂的链式调用或分步操作。

性能考量: 对于大多数常见的数据集大小,这两种方法都比传统的Python循环快得多。在极大规模的数据集上,eval() 可能会因其底层的NumExpr优化而略胜一筹。然而,在实际应用中,选择哪种方法更多取决于代码的可读性、维护性以及个人或团队的偏好。

总结

Pandas为DataFrame中的批量算术运算提供了多种高效且灵活的工具。DataFrame.eval() 提供了一种简洁的字符串表达式方式,适用于复杂的多行逻辑。而链式调用 add() 和 sub() 等方法则通过向量化和广播机制,为重复的、结构化的运算提供了清晰高效的解决方案。掌握这两种方法,将使您能够更有效地处理数据,编写出更简洁、更专业的Pandas代码。在实际工作中,建议根据具体任务的复杂性、代码的可读性要求以及性能需求来选择最适合的方法。

好了,本文到此结束,带大家了解了《Pandas多列批量运算优化技巧》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

QQ音乐网页版免下载入口分享QQ音乐网页版免下载入口分享
上一篇
QQ音乐网页版免下载入口分享
《美物君》教你实用赚钱技巧
下一篇
《美物君》教你实用赚钱技巧
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3220次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3434次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3466次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4572次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3842次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码