You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:45:35