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

Python Pandas遇ZeroDivisionError:已排查非零除数仍报错

解决Pandas筛选后仍触发ZeroDivisionError的问题

问题原因

你的代码中,右侧的除法运算(df['par1'] + df['par2'] + df['par3'] + df['par4']) / df['cont_var']是对整个DataFrame执行的,而非仅针对你筛选出的行。哪怕你只是将结果赋值给筛选后的行,Pandas会先完成全表的除法计算,这时候如果DataFrame其他行存在cont_var=0的情况,就会触发除零错误——哪怕这些行不在你最终赋值的范围内。

另外,cont_var的 dtype 是object,可能存在隐性问题:比如部分行的cont_var是字符串类型的'0',你的筛选条件df['cont_var'] != 0(整数0)无法排除这类值,当参与运算时字符串会被隐式转换为数值0,同样导致错误。

解决方案

方案1:仅对筛选后的子集执行运算

先通过掩码筛选出目标行,再对这些行的列进行计算,避免全表运算:

mask = (df['use'] == 1) & (df['cont_var'] != 0)
# 仅对符合条件的行计算分子和分母
numerator = df.loc[mask, ['par1', 'par2', 'par3', 'par4']].sum(axis=1)
df.loc[mask, 'var'] = numerator / df.loc[mask, 'cont_var']

方案2:使用np.where控制计算范围

np.where会先判断条件,仅对满足条件的行执行除法运算,跳过不满足条件的行:

import numpy as np

df['var'] = np.where(
    (df['use'] == 1) & (df['cont_var'] != 0),
    (df['par1'] + df['par2'] + df['par3'] + df['par4']) / df['cont_var'],
    None
)

方案3:统一cont_var的数值类型

针对object类型可能存在的隐性问题,先将列转换为数值类型,同时处理无效值:

# 将cont_var转为数值,无法转换的设为NaN
df['cont_var'] = pd.to_numeric(df['cont_var'], errors='coerce')
# 更新掩码,排除NaN和0
mask = (df['use'] == 1) & (~df['cont_var'].isna()) & (df['cont_var'] != 0)
df.loc[mask, 'var'] = (df.loc[mask, 'par1'] + df.loc[mask, 'par2'] + df.loc[mask, 'par3'] + df.loc[mask, 'par4']) / df.loc[mask, 'cont_var']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:51:03