提升Pandas代码效率的两个绝妙技巧

如果你曾经使用过pandas处理表格数据,你可能会熟悉导入数据、清洗和转换的过程,然后将其用作模型的输入。然而,当你需要扩展和将代码投入生产时,你的pandas管道很可能开始崩溃并运行缓慢。在这篇文章中,我将分享2个技巧,帮助你提升pandas代码的执行速度,提高数据处理效率并避免常见的陷阱。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

让你的Pandas代码快得离谱的两个技巧

技巧1:矢量化操作

在Pandas中,矢量化操作是一种高效的工具,能够以更简洁的方式处理整个数据框的列,而无需逐行循环。

它是如何工作的?

广播是矢量化操作的一个关键要素,它允许您直观地操作具有不同形状的对象。

eg1: 具有3个元素的数组a与标量b相乘,得到与Source形状相同的数组。

让你的Pandas代码快得离谱的两个技巧

eg2: 在进行加法运算时,将形状为(4,1)的数组a与形状为(3,)的数组b相加,结果会得到一个形状为(4,3)的数组。

让你的Pandas代码快得离谱的两个技巧

已有很多文章讨论了这一点,特别是在深度学习中,大规模矩阵乘法很常见。本文将以两个简短例子进行讨论。

首先,假设您想要计算给定整数在列中出现的次数。以下是 2 种可能的方法。

"""计算DataFrame X 中 "column_1" 列中等于目标值 target 的元素个数。参数:X: DataFrame,包含要计算的列 "column_1"。target: int,目标值。返回值:int,等于目标值 target 的元素个数。"""# 使用循环计数def count_loop(X, target: int) -> int:return sum(x == target for x in X["column_1"])# 使用矢量化操作计数def count_vectorized(X, target: int) -> int:return (X["column_1"] == target).sum()

现在假设有一个DataFrame带有日期列并希望将其偏移给定的天数。使用矢量化操作计算如下:

def offset_loop(X, days: int) -> pd.DataFrame:d = pd.Timedelta(days=days)X["column_const"] = [x + d for x in X["column_10"]]return Xdef offset_vectorized(X, days: int) -> pd.DataFrame:X["column_const"] = X["column_10"] + pd.Timedelta(days=days)return X

技巧2:迭代

「for循环」

第一个也是最直观的迭代方法是使用Python for循环。

代码小浣熊 代码小浣熊

代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节

代码小浣熊 51 查看详情 代码小浣熊

def loop(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:res = []i_remove_col = df.columns.get_loc(remove_col)i_words_to_remove_col = df.columns.get_loc(words_to_remove_col)for i_row in range(df.shape[0]):res.append(remove_words(df.iat[i_row, i_remove_col], df.iat[i_row, i_words_to_remove_col]))return result

「apply」

def apply(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:return df.apply(func=lambda x: remove_words(x[remove_col], x[words_to_remove_col]), axis=1).tolist()

在 df.apply 的每次迭代中,提供的可调用函数获取一个 Series,其索引为 df.columns,其值是行的。这意味着 pandas 必须在每个循环中生成该序列,这是昂贵的。为了降低成本,最好对您知道将使用的 df 子集调用 apply,如下所示:

def apply_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:return df[[remove_col, words_to_remove_col]].apply(func=lambda x: remove_words(x[remove_col], x[words_to_remove_col]), axis=1)

「列表组合+itertuples」

使用itertuples与列表相结合进行迭代肯定会更好。itertuples生成带有行数据的(命名)元组。

def itertuples_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:return [remove_words(x[0], x[1])for x in df[[remove_col, words_to_remove_col]].itertuples(index=False, name=None)]

「列表组合+zip」

zip接受可迭代对象并生成元组,其中第i个元组按顺序包含所有给定可迭代对象的第i个元素。

def zip_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:return [remove_words(x, y) for x, y in zip(df[remove_col], df[words_to_remove_col])]

「列表组合+to_dict」

def to_dict_only_used_columns(df: pd.DataFrame) -> list[str]:return [remove_words(row[remove_col], row[words_to_remove_col])for row in df[[remove_col, words_to_remove_col]].to_dict(orient="records")]

「缓存」

除了我们讨论的迭代技术之外,另外两种方法可以帮助提高代码的性能:缓存和并行化。如果使用相同的参数多次调用 pandas 函数,缓存会特别有用。例如,如果remove_words应用于具有许多重复值的数据集,您可以使用它functools.lru_cache来存储函数的结果并避免每次都重新计算它们。要使用lru_cache,只需将@lru_cache装饰器添加到 的声明中remove_words,然后使用您首选的迭代方法将该函数应用于您的数据集。这可以显着提高代码的速度和效率。以下面的代码为例:

@lru_cachedef remove_words(...):... # Same implementation as beforedef zip_only_used_cols_cached(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:return [remove_words(x, y) for x, y in zip(df[remove_col], df[words_to_remove_col])]

添加此装饰器会生成一个函数,该函数会“记住”之前遇到的输入的输出,从而无需再次运行所有代码。

「并行化」

最后一张王牌是使用 pandarallel 跨多个独立的 df 块并行化我们的函数调用。该工具易于使用:您只需导入并初始化它,然后将所有 .applys 更改为 .parallel_applys。

from pandarallel import pandarallelpandarallel.initialize(nb_workers=min(os.cpu_count(), 12))def parapply_only_used_cols(df: pd.DataFrame, remove_col: str, words_to_remove_col: str) -> list[str]:return df[[remove_col, words_to_remove_col]].parallel_apply(lambda x: remove_words(x[remove_col], x[words_to_remove_col]), axis=1)

以上就是提升Pandas代码效率的两个绝妙技巧的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 17:23:28
下一篇 2025年11月7日 17:24:15

相关推荐

  • 实践CSS3选择器的代码演练

    CSS3选择器动手实践代码 CSS3选择器是Web开发中非常重要的一部分,它可以帮助我们更好地选择和控制HTML元素。在本文中,我们将使用具体的代码示例来学习和实践CSS3选择器的用法。 第一种选择器是元素选择器。它通过HTML元素的标签名进行选择。例如,我们可以使用以下代码选择所有的段落元素: p…

    2025年12月24日
    000
  • CSS中line-height详解(代码实例)

    元素的高度是由什么决定对于我们解决页面显示问题和布局页面都有很大的帮助。 常规的操作表现是为一个块级元素设置height属性,则其拥有了高度: .test { border: 1px solid #ccc; height: 100px; width: 100px; } 但是根据熟知,当我们不为元素设…

    2025年12月24日
    000
  • CSS怎么实现自适应正方形?有代码吗

    本篇文章给大家带来的内容是关于CSS怎么实现自适应正方形?有代码吗,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 CSS实现自适应正方形/*使用padding-bottom实现正方形*/ #test7{ width: 400px; background: gray; } .plac…

    好文分享 2025年12月24日
    000
  • 用CSS实现网站变黑白色

    这篇文章主要介绍了关于用css实现网站变黑白色,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 以下为全站CSS代码.  html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); } 使用方法:这段…

    好文分享 2025年12月24日
    000
  • css悬浮效果阴影实现代码

    本文主要和大家介绍了css实现悬浮效果的阴影的方法示例的相关资料,希望能帮助到大家。我们先来看一下效果图。 要实现的效果图: 实现的代码: -webkit-box-shadow:0px 3px 3px #c8c8c8 ;-moz-box-shadow:0px 3px 3px #c8c8c8 ;box…

    2025年12月24日
    000
  • CSS实现宽高等比布局的代码

    宽度是高度的两倍(等比缩放)实现思路: 以父级元素为基准, 子级 width:100%; (也就是父级宽度的100%), padding-top:50% (也就是父级宽度的50%,根据css规范, padding用百分比表示的话, padding: 100%等于父元素的宽度); 为什么不直接`wid…

    2025年12月24日
    000
  • CSS记录用户密码实现代码分享

    本文主要和大家介绍了css 记录用户密码的方法的相关资料,简单的css代码,甚至不符合图灵完备的语言,但是也能成为一些攻击者的工具,下面简单介绍一下如何使用css去记录用户的密码。但是这些css脚本会出现在第三方css库中,所以使用第三方css库也需要谨慎,确保代码安全。直接上代码解析: input…

    2025年12月24日
    000
  • css实现简单时间轴的实例代码

    本文主要和大家介绍了前端css实现最基本的时间轴的示例代码,分享给大家,给大家做个参考,希望能帮助到大家。 原型: 代码: 状态详情 #timeleft p { height: 65px; color: #333333; } #timecenter p { height: 65px; color: …

    2025年12月24日 好文分享
    000
  • CSS实现动态气泡背景代码分享

    本文主要和大家介绍了css 动画实现动态气泡背景的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 今天的第一个任务是写个登录页面,老大给了我一个参(chao)考(xi)案例,大家点击链接就能看到。嗯,这个登录页面确实很简洁、大方,尤其是…

    2025年12月24日
    000
  • css垂直居中实现代码

    本文主要和大家分享css垂直居中实现代码,希望本文css代码能帮助到大家。 1.如果是单行文本, line-height 的值和height相等 案例如下: 立即学习“前端免费学习笔记(深入)”; .verticle{ height: 100px; line-height: 100px;} 2.已知…

    好文分享 2025年12月24日
    000
  • 介绍CSS3中的几个新技术

    网页制作Webjx文章简介:网页教学网将在这篇文章向大家展示CSS中的5个有趣的新技术:圆角、个别圆角、不透明度、阴影和调整元素大小.            CSS是众所周知且应用广泛的网站样式语言,在它的版本三(CSS3)计划中,新增了一些能够节省时                        …

    2025年12月23日
    000
  • html如何学起_HTML初学者的学习起点建议【建议】

    HTML初学者应从文档结构、语义化标签、本地环境、交互平台和源码模仿五方面入手:先掌握DOCTYPE、html、head、body等基本结构;再学习h1~h6、p、ul/ol、a、img等常用标签用法;接着配置本地编辑器与浏览器调试环境;然后利用w3schools等平台即时验证;最后通过分析真实网页…

    2025年12月23日
    000
  • JavaScript DOM操作:高效移除子元素上的指定CSS类

    本教程将详细介绍如何使用JavaScript高效地从父元素的多个子元素中移除指定的CSS类。我们将探讨常见的DOM操作误区,并提供一个健壮的解决方案,利用querySelectorAll选择器、forEach迭代以及classList.remove方法来批量处理元素。此外,还将演示如何为按钮添加事件…

    2025年12月23日
    000
  • html怎么让一句代码不运行_禁html单句代码运行设置【设置】

    1、使用HTML注释包裹代码使其不被解析;2、通过CSS设置display:none隐藏元素但保留结构;3、利用JavaScript条件判断控制是否执行DOM操作。 如果您希望在HTML中让某段代码不被执行或显示,可以通过特定方式使其失效或注释掉。以下是实现该目标的具体方法: 一、使用HTML注释语…

    2025年12月23日
    000
  • html如何切换div_HTML div元素显示隐藏(display/toggle)切换方法

    实现div显示隐藏的核心是通过JavaScript操作CSS样式,推荐使用classList.toggle()切换CSS类(如.hidden)来分离关注点,既简洁又易维护;也可直接修改style.display属性或使用jQuery的toggle()方法。除display外,visibility: …

    2025年12月23日
    000
  • 如何优雅地管理Select2互斥选择器并避免循环事件

    本教程旨在解决在使用Select2插件时,两个互斥选择器(如黑名单与白名单)之间因事件触发机制不当导致的无限循环问题。文章将深入分析`Maximum call stack size exceeded`错误的原因,并提供一个简洁有效的解决方案,即通过直接设置值而非触发`change`事件来确保选择器状…

    2025年12月23日
    000
  • html官方资源入口_html网站免费设计导航

    html网站免费设计导航入口是https://www.htmldesignresources.com,该平台提供HTML模板、响应式示例、表单组件和CSS样式资源,支持预览、搜索、筛选与代码复制,并设有社区投稿、论坛交流及季度报告更新功能。 html网站免费设计导航入口在哪里?这是不少网页设计爱好者…

    2025年12月23日
    000
  • Flask 模板中显示文本内容的最佳实践

    本文旨在指导开发者在使用 Flask 框架渲染 HTML 模板时,如何规范地显示文本内容。针对将文本直接放置于 ` ` 标签内可能导致的问题,文章强调了遵循 HTML 语义化最佳实践的重要性,并提供了将文本包裹在 ` ` 或 “ 等标签中的解决方案,确保内容正确渲染并提升代码可维护性。 …

    2025年12月23日 好文分享
    000
  • html5怎么写_HTML5文档标准结构与代码编写规范

    HTML5标准结构包括DOCTYPE声明、html、head、body,需包含charset、viewport、title等meta信息,使用语义化标签如header、nav、main、article、footer,代码应小写、双引号、合理缩进,JS放底部,提升可读性与兼容性。 编写HTML5文档时…

    2025年12月23日
    000
  • JS如何创建和管理复杂的HTML组件_JS创建和管理复杂HTML组件方法

    使用类封装、模板字符串、事件委托和状态管理可高效构建复杂HTML组件。首先通过类(Class)集中管理组件结构与状态,如创建可折叠面板;其次利用模板字符串生成动态HTML并批量渲染卡片;再通过事件委托优化大量交互元素的性能;最后模拟生命周期方法实现加载、更新与销毁逻辑。结合这些方法提升代码复用性与可…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信