如何从DataFrame中移除包含NaN、+inf、-inf值的列
精准删除含NaN、±inf异常值列的实现方案
所有pandas内置的缺失值过滤工具本身就支持列级别的过滤,只需要调整计算维度参数,不需要写自定义循环逐列判断。
核心操作步骤
- 第一步:统一异常值的识别规则
原生isna()、dropna()方法默认仅识别NaN,不会自动把+inf、-inf判定为异常值,需要先统一识别逻辑:import pandas as pd import numpy as np # 构造包含三类异常值的测试DataFrame df = pd.DataFrame({ "有效列_1": [1, 2, 3, 4], "含NaN列": [1, np.nan, 3, 4], "含正无穷列": [1, 2, np.inf, 4], "含负无穷列": [1, 2, 3, -np.inf] }) # 全局配置:将±inf自动识别为NaN,纳入异常值判定范围 pd.set_option('mode.use_inf_as_na', True) - 第二步:执行列级别的异常值移除
直接调用dropna()方法,指定axis=1参数,即可自动校验每一列的异常值:只要某一列中存在至少一个NaN、±inf异常值,就会被整列移除。
执行完成后,仅保留# axis=1 代表按列维度过滤 cleaned_df = df.dropna(axis=1)有效列_1,其余含异常值的三列会被全部删除。
不修改全局配置的自定义实现方案
如果不希望改动pandas全局配置,可以手动逐列校验三类异常值,筛选符合要求的列生成新DataFrame:
valid_columns = [] for col in df.columns: # 逐列判断:无NaN、无正无穷、无负无穷,才标记为有效列 has_nan = df[col].isna().any() has_pos_inf = (df[col] == np.inf).any() has_neg_inf = (df[col] == -np.inf).any() if not has_nan and not has_pos_inf and not has_neg_inf: valid_columns.append(col) cleaned_df = df[valid_columns]
灵活调整的常用参数
如果不需要删除所有含异常值的列,只需要满足某一有效样本占比的列保留,可以配合thresh参数实现:
- 比如设置
thresh=3,代表某一列中至少有3个非异常值,才会被保留:cleaned_df = df.dropna(axis=1, thresh=3) - 注意不要混淆axis参数的取值:
axis=0是大家常见的删除含异常值的行操作,axis=1才对应删除含异常值的列。
内容的提问来源于stack exchange,提问作者Klinda
相关产品推荐
相关产品推荐

