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

如何创建函数将缺失值错误信息追加到错误字典(含行列定位)

缺失值错误日志的追加实现方案

需求与问题

需要创建函数将缺失值错误信息写入errors结构(后续导出为JSON用于数据集修正),错误信息需包含行号、列名及提示语句。现有代码存在两个核心问题:

  • 行号识别错误:无法精准定位缺失值所在行
  • 错误信息覆盖:每次生成错误会替换原有信息,无法追加新错误

现有代码

import pandas as pd
import numpy as np

data=[[np.nan, 'Indiana','test@gmail.com']]
df=pd.DataFrame(data,columns=['Name','State','Email'])

req_dict={"Name","Email"}

errors={}
def req_cols (df,req_dict,errors):
    for c in req_dict:
        for i in df.index:
            if df[c].isna().any():
                errors={ "row": i,                                    
                     "column": c,                                                 
                     "message": "This is a required field, fill in "+c+ " accordingly" }                        
    return errors

问题分析

  1. 行号匹配错误:df[c].isna().any()会检查整列是否存在缺失值,而非判断当前遍历的行i是否缺失,导致行号与实际缺失行不对应。
  2. 无法追加错误:每次生成错误时直接赋值errors = {...},会完全覆盖之前的errors字典,丢失已记录的错误信息。

修正方案

方案1:用列表存储错误条目(推荐)

将errors改为列表,每个错误作为独立字典追加进去,既避免覆盖问题,也符合JSON数组的序列化规范。

import pandas as pd
import numpy as np

# 新增一行测试多个缺失值场景
data=[[np.nan, 'Indiana','test@gmail.com'], [np.nan, 'Ohio', np.nan]]  
df=pd.DataFrame(data,columns=['Name','State','Email'])

req_dict={"Name","Email"}

# 初始化为空列表,用于存储所有错误条目
errors = []  

def req_cols(df, req_dict, errors):
    for c in req_dict:
        # 精准获取当前列所有缺失值的行索引
        missing_rows = df[df[c].isna()].index
        for row_idx in missing_rows:
            error_entry = {
                "row": int(row_idx),  # 转为int类型,适配JSON序列化
                "column": c,
                "message": f"This is a required field, fill in {c} accordingly"
            }
            errors.append(error_entry)  # 追加新错误,不覆盖原有内容
    return errors

# 调用函数生成错误日志
req_cols(df, req_dict, errors)

# 打印结果
for err in errors:
    print(err)

输出结果

{'row': 0, 'column': 'Name', 'message': 'This is a required field, fill in Name accordingly'}
{'row': 1, 'column': 'Name', 'message': 'This is a required field, fill in Name accordingly'}
{'row': 1, 'column': 'Email', 'message': 'This is a required field, fill in Email accordingly'}

方案2:保持外层字典结构

如果需要errors为字典格式(例如外层包含元数据),可以在字典内用列表存储错误条目:

import pandas as pd
import numpy as np

data=[[np.nan, 'Indiana','test@gmail.com'], [np.nan, 'Ohio', np.nan]]
df=pd.DataFrame(data,columns=['Name','State','Email'])

req_dict={"Name","Email"}

# 外层为字典,内部用列表存储错误
errors = {"errors": []}  

def req_cols(df, req_dict, errors):
    for c in req_dict:
        missing_rows = df[df[c].isna()].index
        for row_idx in missing_rows:
            error_entry = {
                "row": int(row_idx),
                "column": c,
                "message": f"This is a required field, fill in {c} accordingly"
            }
            errors["errors"].append(error_entry)
    return errors

req_cols(df, req_dict, errors)
print(errors)

输出结果

{'errors': [{'row': 0, 'column': 'Name', 'message': 'This is a required field, fill in Name accordingly'}, {'row': 1, 'column': 'Name', 'message': 'This is a required field, fill in Name accordingly'}, {'row': 1, 'column': 'Email', 'message': 'This is a required field, fill in Email accordingly'}]}

核心优化点

  • 精准定位缺失行:通过df[df[c].isna()].index直接获取当前列所有缺失值的行索引,避免无效遍历。
  • 错误追加逻辑:使用append()方法添加新错误条目,而非直接赋值覆盖原有内容。
  • 适配JSON序列化:将行号转为int类型,避免pandas索引类型导致的序列化问题。
  • 简洁字符串拼接:使用f-string替代传统字符串拼接,提升代码可读性。

内容的提问来源于stack exchange,提问作者surf tastic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:15:39