Pandas自定义行标签判断时,如何在列缺失时跳过条件避免KeyError
列缺失自动跳过判断的Pandas标签实现方案
问题根因
你当前代码通过硬索引row['列名']直接取值,只要引用的列不在DataFrame列集合中,就会直接抛出KeyError中断执行;同时原代码存在未写完的语法分支if row['Semi-annual dividend'] is not in :,本身无法正常编译运行。
具体实现思路
核心逻辑是给所有列的取值增加前置存在性校验,避免硬索引触发报错,实现两个目标:
- 某条判断依赖的任意一列缺失时,自动让该判断分支不成立,跳过校验
- 不中断后续所有有效判断的执行
注意不要用try-except捕获KeyError的方式实现该逻辑,逐行处理时高频异常捕获会带来明显的性能损耗,前置判断列存在性的方式运行效率更高。
改造后可运行代码
# 封装安全取值工具:列不存在时返回默认值,不触发KeyError def safe_get(row, col_name, default=0): # 逐行处理时,row是带原表列索引的Series,直接校验列是否存在即可 if col_name in row.index: return row[col_name] # 列不存在返回默认值,让对应判断分支自动不满足条件 return default def label_exception (row): # 依赖列:Dividend with no set frequency if safe_get(row, 'Dividend with no set frequency') >= 1 : return 'ExceptionCase' # 依赖列:count、Monthly dividend if (safe_get(row, 'count') != 12) and (safe_get(row, 'Monthly dividend') > 1) : return 'ExceptionCase' # 依赖列:count、Quarterly dividend if (safe_get(row, 'count') != 4) and (safe_get(row, 'Quarterly dividend') > 1) : return 'ExceptionCase' # 依赖列:count、Semi-annual dividend if (safe_get(row, 'count') != 2) and (safe_get(row, 'Semi-annual dividend') > 1): return 'ExceptionCase' # 依赖列:count、Annual dividend if (safe_get(row, 'count') != 1) and (safe_get(row, 'Annual dividend') > 1): return 'ExceptionCase' # 删除原代码中未写完的非法语法分支 else: return 'NotanExceptionCase' # 逐行应用标签逻辑 Final_Output['exception'] = Final_Output.apply (lambda row: label_exception(row), axis=1)
运行效果说明
- 只要某条判断分支依赖的任意一列不存在,
safe_get函数会返回默认值0,对应判断条件会自动变为不成立,代码直接跳过该分支,继续执行后续校验,不会触发KeyError - 举例:如果当前DataFrame没有
Monthly dividend列,第二条判断的逻辑会自动变为(count值 != 12) and (0 > 1),后半段永远为False,整条判断直接忽略,完全匹配缺列自动跳过的需求 - 额外修正了原代码的两个问题:把逐行标量判断中误用的
&替换为and,避免不必要的位运算警告;删除未写完的非法if分支,消除语法错误
内容的提问来源于stack exchange,提问作者eeco_haldia
相关产品推荐
相关产品推荐

