Pandas移除缺失值占比超10%列报错求助(IndexingError)
解决Pandas移除高缺失率列的索引错误问题
看起来你已经正确计算了各列的缺失值占比,但遇到了索引使用的问题——这很常见,尤其是刚接触Pandas Series和DataFrame索引的时候。让我一步步帮你解决:
问题原因分析
你计算出来的result是一个Pandas Series对象(一维结构),而不是DataFrame。从你的输出也能看出来,它只有列名作为索引,对应的缺失率是值。当你用result.iloc[:,0]时,你试图用二维索引(行+列)去访问一维的Series,这就触发了IndexingError: Too many indexers。
正确的实现步骤
1. 确认缺失率计算(你的这部分是对的)
先把你的原始代码和输出放出来,方便对照:
df_missing = df.isna() result = df_missing.sum() / len(df)
输出:
Default 0.010066 Income 0.142857 Age 0.109090 Name 0.047000 Gender 0.000000 Type of job 0.200000 Amt of credit 0.850090 Years employed 0.009003 dtype: float64
2. 筛选符合条件的列
我们需要从result中找出缺失率≤10%(即≤0.1)的列名,然后用这些列名去切片原始DataFrame:
# 筛选缺失率≤0.1的列名 keep_columns = result[result <= 0.1].index # 保留这些列到新的DataFrame filtered_df = df[keep_columns]
3. 验证结果
运行上面的代码后,filtered_df就会只保留Default、Name、Gender、Years employed这几列,完全符合你的预期。
额外小技巧
你也可以把整个过程简化成一行代码,更简洁:
filtered_df = df.loc[:, (df.isna().sum() / len(df)) <= 0.1]
这里用df.loc[:, 布尔条件]直接在原DataFrame上筛选列,省去了中间变量result,适合追求代码简洁的场景。
内容的提问来源于stack exchange,提问作者noob




