Pandas如何对DataFrame所有列按条件批量更新字段值
Pandas全列批量应用条件值替换实现方案
你当前的单列处理逻辑完全正确,要批量覆盖所有列不需要逐列重复写相同代码,优先用Pandas原生向量化操作实现,性能远高于循环写法。
方案1:全表向量化处理(推荐,性能最优)
这个写法会自动对齐所有行列索引,非数值列不会被误修改,代码最简洁:
# 固定规则常量 THRESHOLD = 100000 UINT32_MAX = 4294967295 # 生成全表布尔掩码,标记所有需要替换的单元格 replace_mask = df > THRESHOLD # 直接对命中位置做赋值计算 df[replace_mask] = (UINT32_MAX - df[replace_mask]) + 1
如果你的DataFrame全是数值类型列,直接用这段代码就可以得到和单列处理完全一致的结果。
方案2:仅处理数值列(兼容混合类型表)
如果表中存在字符串、时间、分类等非数值类型列,先筛选数值列再处理,避免类型比较报错:
THRESHOLD = 100000 UINT32_MAX = 4294967295 # 筛选所有数值类型列 numeric_cols = df.select_dtypes(include="number").columns # 仅在数值列范围内生成掩码、做替换 col_mask = df[numeric_cols] > THRESHOLD df[numeric_cols] = df[numeric_cols].mask(col_mask, (UINT32_MAX - df[numeric_cols]) + 1)
方案3:逐列循环写法(逻辑最直观,适合小数据量)
如果更习惯逐列处理的逻辑,可以写循环遍历列,和你原来的单列代码逻辑完全一致:
THRESHOLD = 100000 UINT32_MAX = 4294967295 for col_name in df.columns: # 跳过非数值列 if not pd.api.types.is_numeric_dtype(df[col_name]): continue # 复用你原来的单列处理逻辑 col_mask = df[col_name] > THRESHOLD df.loc[col_mask, col_name] = (UINT32_MAX - df.loc[col_mask, col_name]) + 1
避坑提示:不要使用
df.apply()搭配自定义lambda的方式实现该逻辑,apply本质是逐行/逐列的Python层循环,性能比原生向量化操作低1~2个数量级,数据量超过10万行时差距会非常明显。
内容的提问来源于stack exchange,提问作者Hisham Alfoqaha
相关产品推荐
相关产品推荐

