【问题标题】:ZeroDivisionError: float division by zero (python 3.6)ZeroDivisionError:浮点除以零(python 3.6)
【发布时间】:2018-03-03 00:16:44
【问题描述】:

我使用下面的代码绕过除以零错误仍然得到一,无法弄清楚这里实际出了什么问题。

df.loc[:,'B to A Ratio'] =np.where(df.loc[:,'A']!=0,df.loc[:,'B']/df.loc[:,'A'],np.nan)

仅供参考,我正在对从数据透视表创建的数据框执行此操作。此处的“A”和“B”列仅用于说明。

【问题讨论】:

  • 因为您仍在执行被零除:df.loc[:,'B']/df.loc[:,'A']np.where 之后进行选择。

标签: python-3.x pandas numpy


【解决方案1】:

正如@Divakar 所评论的,当您使用np.where 时,仍然对两个系列中的所有值进行完全评估;为避免被零除,您可以在除法前将零转换为nan,因为任何除以nan 的值都会得到nan

df = pd.DataFrame({
        "A": [1,2,0,3,4],
        "B": [0,2,1,0,1]
    })
​
df.B.div(df.A.where(df.A != 0, np.nan))

#0    0.00
#1    1.00
#2     NaN
#3    0.00
#4    0.25
#dtype: float64

也不确定你的 pandas 版本是什么,在 pandas 0.19 ~ 0.20 中除以零会得到 inf 而不是引发错误

df.B / df.A

#0    0.000000
#1    1.000000
#2         inf
#3    0.000000
#4    0.250000
#dtype: float64

【讨论】:

  • 谢谢这个工作!或者我使用下面的代码:data['B to A Ratio'] = data.apply(lambda x :x['B']/x['A'] if x['A']!=0 else np.nan,axis=1)
  • 我使用的是pandas 0.20.1版,它没有提供inf
  • 我没有0.20.1。但是0.19.20.20.3 确实给出了inf。也许您正在划分 numpy 数组而不是 pandas 系列,在这种情况下我会收到警告消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多