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

如何让Pandas适配不同Excel模板的动态列名校验?

问题描述

需使用Pandas读取两个不同Excel模板,校验指定列的数值是否匹配valid.json中的标准值:

  • 模板1目标列名为Industry,对应JSON中的一组标准值
  • 模板2目标列名为Industry EU,对应JSON中的另一组标准值
    当前校验代码因固定指定列名,读取缺少对应列的模板时会触发column industry not found报错,需实现先读取列名再动态适配的逻辑,且无需依赖固定文件名。原校验代码如下:
with open('valid.json', 'r') as validvals:
    valid = json.load(validvals)

#checking for industry, Industry EU, AccountType and System_Type__c Standard values
df1= df[['industry','System_Type__c','AccountType', 'Industry EU','country','state']]
mask = df1.apply(lambda c: c.isin(valid[c.name]))
df1.mask(mask|df1.eq(' ')).stack()
for err_i, (r, v) in enumerate(df1.mask(mask|df1.eq(' ')).stack().iteritems()):
    errors[filename][err_i] = {"row": r[0],
                               "column": r[1],
                               "message": v + " is invalid check column " + r[1] + ' and replace with a standard value'}
解决方案

核心是动态筛选当前Excel中实际存在的待校验列,只保留valid.json中定义且当前DataFrame包含的列,避免因列不存在报错。修改后的代码如下:

import json
import pandas as pd

with open('valid.json', 'r') as validvals:
    valid = json.load(validvals)

# 定义所有可能需要校验的列(包含Industry、Industry EU及其他固定校验列)
possible_check_columns = ['Industry', 'Industry EU', 'System_Type__c', 'AccountType', 'country', 'state']
# 动态筛选当前DataFrame中存在的列
existing_columns = [col for col in possible_check_columns if col in df.columns]
# 只保留存在的列进行校验
df1 = df[existing_columns]

# 生成校验掩码:仅对valid中存在对应标准值的列进行校验
mask = df1.apply(lambda c: c.isin(valid.get(c.name, [])) if c.name in valid else pd.Series([True]*len(df1)))
# 筛选出无效值(不匹配标准值或为空字符串)
invalid_values = df1.mask(mask | df1.eq(' ')).stack()

# 收集错误信息
for err_i, (r, v) in enumerate(invalid_values.iteritems()):
    errors.setdefault(filename, []).append({
        "row": r[0] + 1,  # 转换为Excel的1起始行号
        "column": r[1],
        "message": f"{v} 无效,请检查列 {r[1]} 并替换为标准值"
    })

关键修改点说明

  • 动态列筛选:遍历所有可能的校验列,仅保留当前Excel中实际存在的列,彻底避免列不存在的KeyError
  • 兼容标准值缺失:用valid.get(c.name, [])处理valid.json中未定义的列,默认将这类列的所有值视为有效
  • 错误收集优化:用errors.setdefault避免字典键不存在的问题,同时将行号转换为Excel习惯的1起始格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:40:40