如何在 Pandas DataFrame 中仅对指定索引行应用向量化函数

发布时间 - 2025-12-30 00:00:00    点击率:

本文介绍如何高效地将一个返回多值的自定义函数(如 `computeleft`)仅应用于 dataframe 的特定行索引,其余位置自动填充为 nan,避免全量计算,兼顾性能与可读性。

在实际数据处理中,我们常需对 DataFrame 的部分行(而非全部)执行复杂计算,并将结果写入多个列。例如,函数 computeLeft(i) 接收索引 i,返回长度为 4 的 NumPy 数组 [2i, 3i, 4i, 5i],期望将其结果分别填入 ["val1", "val2", "val3", "val4"] 四列中——但仅针对指定索引(如 [2, 5, 7, 8, 10])的行,其余行对应位置应保持为 NaN。

直接使用 np.vectorize 全量计算(如 df[results] = np.vectorize(...)(range(len(df))))虽可行,但效率低且不满足“按需计算”需求。更优解是:先初始化目标列为 NaN,再通过 .loc 精准赋值。具体步骤如下:

  1. 确保函数签名正确:computeLeft 应返回标准 NumPy 数组(非 Python list),并用 np.vectorize 显式声明输出形状(signature="()->(4)"):

    def computeLeft(i):
        return np.array([i*2, i*3, i*4, i*5])
    
    computeLeft_vec = np.vectorize(computeLeft, signature="()->(4)")
  2. 预分配目标列并填充 NaN

    results = ["val1", "val2", "val3", "val4"]
    df[results] = np.nan  # 所有行初始化为 NaN
  3. 使用 .loc 对指定索引批量赋值

    indices_to_change = [2, 5, 7, 8, 10]
    df.loc[indices_to_change, results] = computeLeft_vec(indices_to_change)

    ✅ 关键点:indices_to_change 必须与 DataFrame 的实际索引标签(index labels)匹配(而非位置序号 iloc)。若 df.index 是默认整数索引(RangeIndex),则二者一致;若索引已重设(如字符串或非连续整数),请确保传入的是真实索引值。

⚠️ 注意事项: np.vectorize 本质是语法糖,不提升性能;若 computeLeft 可向量化(如纯算术运算),建议直接用 NumPy 原生向量化(例如 np.array(indices_to_change)[:, None] * [2,3,4,5]),速度可提升数十倍。 若需处理缺失索引(如 df 不含索引 7),.loc 会自动扩展 DataFrame(添加新行),若需严格限制仅修改现有索引,可先校验:valid_indices = [i for i in indices_to_change if i in df.index]。 替代方案(如 df.iloc + 位置映射)适用于基于整数位置的场景,但需额外转换索引→位置,易出错,推荐优先使用 .loc 配合语义清晰的索引标签。

此方法简洁、安全、符合 Pandas 惯例,既避免冗余计算,又保证结果的稀疏性与可维护性。


# python 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  PythonWeb开发入门教程_Flask快速构建Web应用  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel如何使用Vite进行前端资源打包?(配置示例)  Android实现代码画虚线边框背景效果  如何在搬瓦工VPS快速搭建网站?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何发送系统通知?(Notification渠道示例)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  JavaScript如何实现错误处理_try...catch如何捕获异常?  教你用AI润色文章,让你的文字表达更专业  如何用腾讯建站主机快速创建免费网站?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  北京企业网站设计制作公司,北京铁路集团官方网站?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  手机网站制作与建设方案,手机网站如何建设?  如何解决hover在ie6中的兼容性问题  如何用y主机助手快速搭建网站?  Android利用动画实现背景逐渐变暗  微信推文制作网站有哪些,怎么做微信推文,急?  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  C语言设计一个闪闪的圣诞树  如何在阿里云高效完成企业建站全流程?  七夕网站制作视频,七夕大促活动怎么报名?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  新三国志曹操传主线渭水交兵攻略  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何在香港服务器上快速搭建免备案网站?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何在Windows虚拟主机上快速搭建网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何快速搭建高效香港服务器网站?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel distinct去重查询_Laravel Eloquent去重方法