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

Pandas操作中如何用Try-Except高效处理逐行运算异常?

处理DataFrame逐行除法的多异常场景

我需要计算DataFrame中numerator列与denominator列的商,最初用以下代码实现:

df['division'] = df['numerator']/df['denominator']

但denominator列是计算结果,偶尔会出现0值导致报错。尝试用try-except处理时,只要有任意异常就会把整个division列设为0,不符合预期:

try:
   df['division'] = df['numerator']/df['denominator']
except: 
   df['division'] = 0

后来用np.where解决了分母为0的问题:

df['division'] = np.where(df['denominator'] != 0, df['numerator']/df['denominator'], 0)

但如果存在多种异常(比如分子/分母为非数值类型、NaN值等),该如何高效实现逐行的异常检查与处理?


方法1:用apply逐行自定义处理

通过自定义函数封装异常逻辑,用apply逐行执行,能精准捕获单个行的异常并处理:

def safe_divide(row):
    try:
        # 执行除法操作
        return row['numerator'] / row['denominator']
    except (ZeroDivisionError, TypeError, ValueError) as e:
        # 可针对不同异常返回不同值,这里统一返回0
        return 0

# 逐行应用函数
df['division'] = df.apply(safe_divide, axis=1)

注意:apply逐行处理直观性强,但大数据量下效率不如向量化操作,适合异常场景复杂或数据量不大的情况。

方法2:用np.vectorize实现向量化异常处理

把自定义函数向量化,比apply效率更高,同时保留try-except的灵活性:

import numpy as np

@np.vectorize
def safe_divide_vec(numerator, denominator):
    try:
        return numerator / denominator
    except (ZeroDivisionError, TypeError, ValueError):
        return 0

# 直接传入整列计算
df['division'] = safe_divide_vec(df['numerator'], df['denominator'])

方法3:组合掩码处理已知异常

如果能提前明确所有异常类型,可通过多个np.where或布尔掩码组合处理,这种方式是纯向量化操作,效率最高:

# 先处理分母为0,再处理非数值/NaN的情况
mask_valid = df['denominator'] != 0 & df['numerator'].notna() & df['denominator'].notna() & df['numerator'].apply(lambda x: isinstance(x, (int, float)))
df['division'] = np.where(mask_valid, df['numerator']/df['denominator'], 0)

这种方式适合能枚举所有异常场景的情况,避免了循环/逐行处理的性能损耗。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:57:30