You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历DataFrame处理缺失值时遇KeyError及Too many indexers错误求助

问题分析与解决方案

错误原因拆解

1. KeyError(loc用法)

  • 你预先保存了初始列名cols,但循环中用inplace=True动态删除列,导致后续循环时df_X的列集合已经和cols不一致,后续的i对应的列可能已被删除,因此loc[:,i]触发KeyError。
  • 额外注意:若列名是整数类型,需确保索引时使用的整数类型和列名一致(比如Python原生int,而非numpy.int),但核心问题还是循环中动态修改DataFrame导致的列不匹配。

2. Too many indexers(iloc用法)

  • 执行df_X= df_X.iloc[:,i].replace(...)时,iloc[:,i]返回的是一维Series,赋值给df_X后,后续循环中df_X已不再是DataFrame,再使用iloc[:,i]这种二维索引就会触发维度不匹配的错误。

正确实现方式

推荐用向量化操作(效率远高于循环),分三步完成:

import numpy as np
import pandas as pd

# 1. 计算每列的缺失率
missing_rates = df_X.isnull().sum() / len(df_X)

# 2. 筛选需保留/删除的列,一次性删除高缺失率列
cols_to_keep = missing_rates[missing_rates <= 0.20].index
df_X = df_X.drop(missing_rates[missing_rates > 0.20].index, axis=1)

# 3. 对保留列用均值填充缺失值
df_X = df_X.fillna(df_X.mean())

如果一定要用循环实现(不推荐,效率较低),需遍历初始列名并避免修改DataFrame类型:

import numpy as np

cols = df_X.columns.tolist()  # 保存初始列名列表
for col in cols:
    # 跳过已被删除的列
    if col not in df_X.columns:
        continue
    missing_rate = df_X[col].isnull().sum() / len(df_X)
    if missing_rate > 0.20:
        df_X.drop(col, axis=1, inplace=True)
    else:
        # 直接对列赋值,避免将DataFrame转为Series
        df_X[col] = df_X[col].replace(np.nan, df_X[col].mean())

内容的提问来源于stack exchange,提问作者Pree07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:52:52