遍历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
相关产品推荐
相关产品推荐

