You need to enable JavaScript to run this app. 如何从DataFrame中移除包含NaN、+inf、-inf值的列
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 10:06:03