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


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

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

技巧1:矢量化操作

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

它是如何工作的?

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

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

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

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

首先,假设您想要计算给定整数在列中出现的次数。以下是 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循环。

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)


# 深度学习  # Python  # pandas  # for  # 循环  # 对象  # 迭代  # 矢量化  # 将其  # 应用于  # 这是  # 您的  # 如果你  # 是在  # 是一种  # 第一个 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化91478 】 【 技术知识72672 】 【 云计算0 】 【 GEO优化84317 】 【 优选文章0 】 【 营销推广36048 】 【 网络运营41350 】 【 案例网站102563 】 【 AI智能45237


相关推荐: AI 播客脚本写作工具:提升内容创作效率的终极指南  AI电子书写作终极指南:ChatGPT和Canva实战教程  AI语音生成器终极指南:免费工具与逼真语音编辑  教你用AI将一篇长文自动拆解成社交媒体帖子,实现一文多发  AI QA 工程:通往人工智能质量保障工程师的职业道路  AI时代生存指南:掌握软实力,成为不可替代的人  唐库AI拆书工具如何批量导出笔记_唐库AI拆书工具批量导出与格式转换【方法】  AI简历优化指南:如何让你的简历轻松通过ATS筛选系统  唐库AI拆书工具怎么查看拆书进度_唐库AI拆书工具进度查看与异常排查【方法】  Ifor Williams拖车终极指南:农场主的选择和省税秘诀  智谱AI绘画怎么用_智谱AI绘画使用方法详细指南【教程】  AI超级英雄大乱斗:蜘蛛侠、死侍的爆笑奇幻之旅  AI数字人教程:轻松打造专属YouTube虚拟形象  利用 Gemini 1.5 Pro 进行超长视频摘要提取  通义千问怎样优化提示词合需求_通义千问需求契合技巧【步骤】  如何使用豆包 AI 练习托福雅思口语对练  2025年最佳AI流程图工具:效率提升秘籍  AI时代设计师生存指南:职业发展、技能提升与未来趋势  智行ai抢票怎么选优先车次_智行ai抢票车次优先级设置技巧【指南】  夸克AI怎样搜索医疗健康_夸克AI医疗频道与症状自查【技巧】  2025数据科学学习指南:技能、工具和学习路线图  Comet浏览器:使用ChatGPT增强您的搜索体验  ChatGPT高级图像编辑教程:黑白转换、裁剪与GIF动画制作  Roblox Studio AI 助手:创意构建与无限可能  Gemini怎样写实用型提示词_Gemini实用提示词编写【攻略】  播客数据深度分析:用户地域分布及增长策略探讨  怎么用AI帮你为初创公司进行市场定位分析?  Runway Gen-2怎么用 Runway视频生成AI使用教程  怎么用AI帮你写一份有说服力的加薪申请?  XRAI Glass:AI赋能的增强现实眼镜,对话新体验  Filmora 13 AI音乐生成器:创意视频配乐新纪元  DeepSeek网页版怎么用_DeepSeek网页版使用方法详细指南【教程】  如何利用豆包 AI 快速查询当地生活服务资讯  百度ai助手怎么取消 百度ai助手取消显示设置  ChatGPT怎么写工作汇报 职场办公效率提升与周报生成方法  AI内容检测与优化:免费工具助你提升内容质量  暖心“小艺通话”:让语障人士告别沟通困境,拥抱平等生活  使用 DeepSeek 生成符合工业标准的 API 文档  服务合同模板:起草、签署和管理指南,提升业务效率  免费AI头像生成终极指南:逼真、个性化、无水印  如何利用文心一言优化知乎高赞回答的逻辑结构  如何用AI根据职位描述(JD)定制你的求职信?  如何用ChatGPT模拟面试并优化你的求职文书?  揭秘颜值真相:社交实验的背后,你是几分?  AI网页生成工具有哪些_一键生成企业官网的AI工具推荐  Replika AI:情感慰藉还是虚拟危机?深度剖析与用户反馈  AI动画制作教程:Adobe Express一键语音转动画  AI语音生成指南:免费工具、变现实战与避坑策略  阿里通义app怎么用_阿里通义app使用方法详细指南【教程】  AI CRM集成:提升客户关系管理效率的关键 

 2024-01-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

南京市珐之弘网络技术有限公司


南京市珐之弘网络技术有限公司

南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 87067657

 13565296790

 87067657@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.