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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:52:36