【问题标题】:How is it possible that this returns a ZeroDivisionError? [closed]这怎么可能返回 ZeroDivisionError? [关闭]
【发布时间】:2017-09-12 21:31:50
【问题描述】:

我正在运行以下代码:

df['diff']=np.where(df['fc']!=0,(df['ar']-df['fc'])/df['fc'],0)

它返回一个 ZeroDivisionError。当我指定仅在分母不等于 0 时才运行该公式时,我不确定这是如何发生的。如果我运行下面的代码,它可以工作,但我不想删掉这是真的行:

df2=df[df['fc']!=0]
df2['diff']=(df['ar']-df['fc'])/df['fc']

编辑为“指定明确的目标”:此处所需的输出将在分母为 0 时返回 0,并在分母 > 0 时返回差 %。

感谢您的回答!完美运行。

【问题讨论】:

  • (df['ar']-df['fc'])/df['fc'] 对所有元素进行除法,无论是否为零。
  • “当我指定仅在分母不等于 0 时运行该公式时,我不确定这是怎么发生的” 不,这不是你在做什么。 np.where 不会神奇地改变 Python 的工作方式,因为所有表达式在作为参数传递之前都会被评估为其值。 np.where 返回值您传递给它的布尔数组是真实的。你不传递一个表达式,你传递一个值
  • @sokeefe1014,我无法使用您的np.where(...) 代码复制它。能否提供一个小样本可重现的数据集?
  • 这里有两个有用的问题:one, two 但如果我没记错的话,在最近的版本中它不会引发错误而是警告并返回 nan 或 @ 987654330@.
  • "它执行此操作,但仅在限定符为真时保留该值?" - 确切地。 numpy.where 不是条件执行;它是条件选择,根据条件数组从已经存在的数组中选择结果。

标签: python pandas


【解决方案1】:

嗯,你对np.where(condition, [x, y])函数有一点误解。当您进行调用时,输入参数xy 将首先被评估。在您的情况下,x=(df['ar']-df['fc'])/df['fc'],这样如果 df['fc'] 包含任何零,您将遇到ZeroDivisionError。我喜欢@user2357112 的评论,np.where 执行条件选择,x 如果为真,y 如果每个元素为假。

如果您想保留所有元素,即使df['fc'] 为零,您可以先将这些元素设置为np.nan。计算完成后,您可以处理这些NAN 值,例如,将它们设置为零。

这是伪代码:

df.loc[df.fc == 0, 'fc'] = np.nan
df['diff'] = ((df.ar-df.fc)/df.fc).fillna(0)

这里是划分np.nan的测试:

In [1]: a = np.array([1.0, np.nan])

In [2]: 2/a
Out[2]: array([  2.,  nan])

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 2014-02-21
    • 2017-08-07
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    相关资源
    最近更新 更多