Pandas删除高缺失率列时出现Series索引越界错误
解决删除高缺失率列时的IndexError问题
错误原因
你的循环代码会动态修改cosmos的列数,但循环范围是基于初始列数(也就是len(a)的初始值)。比如初始有7列,循环中删了一列后cosmos只剩6列,但循环还会按初始长度继续跑,当i取值到原列数对应的索引时,cosmos.columns[i]就超出了现有列的索引范围,触发IndexError。报错里提到的axis0,是因为访问cosmos.columns[i]时,这个索引针对的是columns序列的轴0,和drop指定的axis1无关。
正确解决方案
不要在循环中逐列删除,应该先一次性找出所有缺失率超过80%的列,再批量删除,彻底避免索引越界问题。
示例代码
# 计算每列的缺失率 missing_rates = cosmos.isna().sum() / len(cosmos) * 100 # 筛选出缺失率>80%的列名 cols_to_drop = missing_rates[missing_rates > 80].index # 批量删除目标列 cosmos.drop(cols_to_drop, axis=1, inplace=True)
代码说明
- 先计算所有列的缺失率,得到一个与原数据列一一对应的Series;
- 通过布尔索引筛选出符合条件的列名;
- 最后一次性删除所有目标列,全程不会在中途修改数据集结构,从根源避免了循环中的索引混乱。
内容的提问来源于stack exchange,提问作者Jos Joe
相关产品推荐
相关产品推荐

