使用loc遍历DataFrame时出现意外KeyError问题求助
问题原因
KeyError的根源是bad_nan保留了原DataFrame的行索引,你用range(bad_nan.shape[0])生成的是连续的0、1、2...这类序号,但这些序号并不是bad_nan实际的行索引值,所以bad_nan.loc[i, col]找不到对应的行,抛出KeyError。
另外,将列转为字符串再判断等于'nan'的做法容易出错(比如原数据中本身就有字符串'nan'的情况),直接用pd.isna()判断缺失值才是可靠方式。
修正方案
方案一:用iterrows()遍历(直观易读)
import pandas as pd errors = [] req_cols = ['First Name*','Last Name*','Country*','Company*','Email Address*'] # 筛选出至少有一个必填列是NaN的行 bad_nan = df[df[req_cols].isna().any(axis=1)] # 遍历bad_nan的每一行,获取原行索引和行数据 for row_idx, row_data in bad_nan.iterrows(): # 检查每个必填列是否为NaN for col in req_cols: if pd.isna(row_data[col]): errors.append({ "row": row_idx, "column": col, "message": "This is a required field" })
方案二:向量化操作(高效,适合大数据集)
避免显式循环,利用pandas内置方法快速定位所有NaN的位置:
import pandas as pd req_cols = ['First Name*','Last Name*','Country*','Company*','Email Address*'] # 获取所有必填列中NaN的位置掩码 nan_mask = df[req_cols].isna() # 转换为长格式,提取存在NaN的行索引和列名 nan_positions = nan_mask.stack()[nan_mask.stack()].reset_index() # 生成错误列表 errors = [] for _, row in nan_positions.iterrows(): errors.append({ "row": row['level_0'], "column": row['level_1'], "message": "This is a required field" })
说明
- 两种方案都会保留原DataFrame的行索引(即你预期的
row值,比如原df中的行2),而非子集的相对位置。 - 方案二的向量化操作比循环更快,数据量较大时优势明显。
内容的提问来源于stack exchange,提问作者user19788086
相关产品推荐
相关产品推荐

