如何在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
相关产品推荐
相关产品推荐

