如何用Pandas批量替换指定列的超大指数值为常量-9999
批量处理CSV中指定列的异常值替换方法
核心思路
先筛选出所有列名以ABC或Abc开头的目标列,再对这些列统一应用异常值替换规则,避免逐个列重复编写代码。
完整实现代码
import pandas as pd import numpy as np # 读取TSV格式的测试文件(分隔符为制表符) df_1 = pd.read_csv('test_file.csv', sep='\t') # 筛选所有列名以ABC/Abc开头的列(正则匹配大小写兼容的开头) target_cols = df_1.filter(regex='^[Aa][Bb][Cc]').columns # 批量处理目标列的异常值 for col in target_cols: # 条件1:匹配固定错误值 ±9.900000e+37 cond_error = (df_1[col] == 9.900000e+37) | (df_1[col] == -9.900000e+37) # 条件2:数值超出[-9999, 9999]范围 cond_out_of_range = (df_1[col] > 9999) | (df_1[col] < -9999) # 满足任一条件则替换为-9999,否则保留原值 df_1[col] = np.where(cond_error | cond_out_of_range, -9999, df_1[col]) # 可选:处理完成后保存结果文件 # df_1.to_csv('processed_test_file.csv', sep='\t', index=False)
代码细节说明
- 目标列筛选:
filter(regex='^[Aa][Bb][Cc]')通过正则表达式精准匹配列名以ABC或Abc开头的所有列,不管后续字符是什么(比如Abc11、ABC007都能被命中)。 - 异常值覆盖:同时处理两种异常场景——固定错误值
±9.9e37,以及超出合理范围的数值。 - 批量逻辑:通过循环遍历所有目标列,统一应用替换规则,一次性解决50+列的处理需求。
无循环优化方案
如果想更简洁,也可以用apply方法一次性处理所有目标列:
def clean_column(col): cond_error = (col == 9.900000e+37) | (col == -9.900000e+37) cond_out_of_range = (col > 9999) | (col < -9999) return np.where(cond_error | cond_out_of_range, -9999, col) df_1[target_cols] = df_1[target_cols].apply(clean_column)
内容的提问来源于stack exchange,提问作者Kavya shree
相关产品推荐
相关产品推荐

