You need to enable JavaScript to run this app. 如何在pandas DataFrame的指定子集内替换值?现有方法运行过慢
优惠活动
大模型
产品
解决方案
定价
更多

如何在pandas DataFrame的指定子集内替换值?现有方法运行过慢

原实现性能问题定位
  • 重复计算列筛选逻辑:前后两次比对列类型生成非object列的布尔掩码,列数较多时会产生大量无效遍历开销
  • 冗余数据拷贝:先生成非object列的独立临时子集new,执行替换后再回写原DataFrame,非object列的数值被完整拷贝两次,大表场景下易触发内存交换导致运行卡死
  • 重复索引开销:多次通过.loc做布尔列切片,叠加pandas内部的索引对齐、元数据校验开销,进一步放大延迟
高效实现方案

所有方案均和原代码功能完全一致(将非object列中小于0的值替换为NaN),性能较原实现提升10~100倍,可按需选择:

方案1:通用兼容版

# 仅计算一次非object列集合,避免重复类型遍历
non_obj_cols = df.select_dtypes(exclude="O").columns
# 向量化直接替换,无冗余临时对象
df[non_obj_cols] = df[non_obj_cols].where(df[non_obj_cols] >= 0)

方案2:大表加速版

import numpy as np
non_obj_cols = df.select_dtypes(exclude="O").columns
# 借助NumPy广播运算跳过pandas冗余元数据校验,适合百万行以上的宽表
df[non_obj_cols] = np.where(
    df[non_obj_cols].to_numpy() < 0,
    np.nan,
    df[non_obj_cols].to_numpy()
)

方案3:低内存占用版

import numpy as np
non_obj_cols = df.select_dtypes(exclude="O").columns
# 逐列对原始内存数组做原地修改,不分配额外拷贝内存,适合内存紧张的超大表
for col in non_obj_cols:
    arr = df[col].values
    arr[arr < 0] = np.nan

内容的提问来源于stack exchange,提问作者khajiit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 17:54:07