如何让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
相关产品推荐
相关产品推荐

