pandas数据清洗触发index 0越界IndexError的原因与解决方法
pandas分组填充字段众数触发IndexError排查与修复
问题复现
操作流程如下:
- 构造测试DataFrame,包含
ID、Customer_ID、Name、Num_of_Delayed_Payment4个字段,其中Name、Num_of_Delayed_Payment字段存在部分NaN缺失值 - 先处理
Num_of_Delayed_Payment字段:按Customer_ID分组取众数填充缺失值,调用str.rstrip('_')清理字段值后缀,转换为数值类型;计算字段0.01、0.87分位值,执行df[df['Num_of_Delayed_Payment'] < low] = low、df[df['Num_of_Delayed_Payment'] > high] = high做异常值截断 - 执行Name字段填充代码
df['Name']=df['Name'].fillna(df.groupby('Customer_ID')['Name'].transform(lambda x:x.mode().iat[0]))时触发报错:
IndexError: index 0 is out of bounds for axis 0 with size 0
报错根因
报错由两个问题叠加导致:
- 异常值截断写法错误,污染了全表数据:原有截断逻辑没有指定赋值列,只要行满足阈值判断条件,整行所有字段都会被赋值为low/high的浮点值,直接把对应行的
Customer_ID、Name字段原值覆盖为浮点数或NaN,打乱了分组依据,产生了大量Name字段全为空的无效分组 - 众数填充逻辑没有做边界兼容:pandas中对全为NaN的序列调用
.mode()会返回长度为0的空Series,这时候直接取iat[0]必然触发索引越界。哪怕截断逻辑写对,只要存在某个Customer_ID分组下所有Name值全为缺失值,同样会触发这个报错。
修复方案
按以下两步调整代码即可解决:
- 修正异常值截断逻辑,仅对目标字段赋值,禁止整行覆盖:
# 废弃原错误整行赋值写法 # df[df['Num_of_Delayed_Payment'] < low] = low # df[df['Num_of_Delayed_Payment'] > high] = high # 使用loc定位到目标行的目标字段再赋值 df.loc[df['Num_of_Delayed_Payment'] < low, 'Num_of_Delayed_Payment'] = low df.loc[df['Num_of_Delayed_Payment'] > high, 'Num_of_Delayed_Payment'] = high - 改写众数填充逻辑,兼容分组无有效众数的场景,增加全局兜底:
import numpy as np def get_safe_mode(series): mode_result = series.mode() # 众数存在则返回第一个众数,不存在返回空值 return mode_result.iat[0] if len(mode_result) > 0 else np.nan # 先按分组众数填充,分组无有效众数时用全表Name的众数做兜底填充 df['Name'] = df['Name'].fillna( df.groupby('Customer_ID')['Name'].transform(get_safe_mode) ).fillna(df['Name'].mode().iat[0])
内容的提问来源于stack exchange,提问作者Hemant Kumar sain
相关产品推荐
相关产品推荐

