使用DataFrame.Apply()时如何捕获抛出的异常
问题:将DataFrame行处理中的异常捕获到独立数据结构
我有一个DataFrame,其中多列需要通过自定义函数转换/解析,目前用DataFrame.apply()实现的代码如下:
def process_row(row) -> dict: try: newVal = my_conversion(row['oldCol']) out_row= {'newCol': newVal} except Exception as inst: # 转换抛出异常时返回NaN,目前仅打印错误 out_row = {'newCol': float('nan')} print(repr(inst)) return out_row
应用函数的代码:
a = df.apply(lambda x: process_row(x), axis=1, result_type="expand") df1 = df.merge(a, left_index=True, right_index=True)
当前运行正常,异常时会输出NaN并打印错误,但我希望把这些错误信息捕获到独立的DataFrame或列表中,而不是仅打印,也不想把错误信息加入原DataFrame。
解决方案
方法1:使用全局列表存储错误信息
定义一个全局列表,在异常捕获时将错误详情(如行索引、错误内容、原数据)存入其中,后续可转换为DataFrame:
# 初始化全局错误列表 error_records = [] def process_row(row) -> dict: try: newVal = my_conversion(row['oldCol']) out_row= {'newCol': newVal} except Exception as inst: out_row = {'newCol': float('nan')} # 将错误信息存入列表,可按需调整字段 error_records.append({ 'row_index': row.name, 'error_type': type(inst).__name__, 'error_message': str(inst), 'original_data': row.to_dict() }) return out_row # 执行处理 a = df.apply(process_row, axis=1, result_type="expand") df1 = df.merge(a, left_index=True, right_index=True) # 将错误列表转为DataFrame error_df = pd.DataFrame(error_records)
方法2:使用类封装(避免全局变量)
如果不想用全局变量,可以用类来封装处理逻辑和错误记录,更适合复杂场景:
class RowProcessor: def __init__(self): self.error_records = [] def process_row(self, row) -> dict: try: newVal = my_conversion(row['oldCol']) out_row= {'newCol': newVal} except Exception as inst: out_row = {'newCol': float('nan')} self.error_records.append({ 'row_index': row.name, 'error_type': type(inst).__name__, 'error_message': str(inst), 'original_data': row.to_dict() }) return out_row # 实例化处理器 processor = RowProcessor() # 执行处理 a = df.apply(processor.process_row, axis=1, result_type="expand") df1 = df.merge(a, left_index=True, right_index=True) # 获取错误DataFrame error_df = pd.DataFrame(processor.error_records)
说明
- 两种方法都能在不修改原DataFrame的前提下,收集所有异常的详细信息,方便后续排查问题
- 可以根据需求调整
error_records中存储的字段,比如只保留行索引和错误信息,无需原数据
内容的提问来源于stack exchange,提问作者Carlos N
相关产品推荐
相关产品推荐

