Pandas删除first_name、last_name空值行报KeyError[0]如何解决?
报错原因
- 核心问题是遍历DataFrame过程中直接原地删除行:
iterrows()会基于遍历开始时的DataFrame索引迭代,当你调用df.drop(index, inplace=True)删除行后,DataFrame的索引会动态更新,后续迭代到已被删除的索引时,就找不到对应行,抛出KeyError。 - 原有代码还存在逻辑缺陷:若一行存在多个空列,会重复触发删除逻辑,且拒绝原因的格式也不符合要求。
修复实现
不要边遍历边修改原DataFrame,先统一收集错误行的索引和原因,再批量拆分数据即可,示例代码如下:
import pandas as pd # 待校验的列 check_cols = ['first_name', 'last_name'] error_indexes = [] error_reasons = [] # 第一步:遍历收集所有错误信息,不修改原表 for idx, row in df.iterrows(): empty_cols = [] for col in check_cols: # 判断是否为空(空字符串/NaN都算) if row[col] == '' or pd.isna(row[col]): empty_cols.append(col) if empty_cols: error_indexes.append(idx) error_reasons.append(f'{empty_cols} is empty') # 第二步:生成错误表 error_df = df.loc[error_indexes].copy() error_df['rejection_reason'] = error_reasons # 第三步:生成清洗后的正常表 df = df.drop(error_indexes).copy()
运行后df就是你要的正常输出结果,error_df就是错误表,和预期输出完全一致。
内容的提问来源于stack exchange,提问作者Naveen Gupta
相关产品推荐
相关产品推荐

