【问题标题】:handing exceptions based on a particular data frame column基于特定数据框列处理异常
【发布时间】:2019-04-17 06:29:31
【问题描述】:

我有一个数据框如下:

现在我想将 x 除以 y 值而不给我一个例外。例如,当我将 3 除以 2 时,它应该给我 1.5,而当我将 3 除以 0 时,它应该给我零。为此,我编写了一个异常函数

def divide(x,y):
    try:
        result = x/y
        print (result)
    except ZeroDivisionError:
        print (0)

我现在想在数据框中创建一个新列并应用此功能。到目前为止我用过:

df['num']  = df.apply(divide)

但这并没有给我所需的结果。有人可以帮忙吗

【问题讨论】:

  • 使用return x/y 代替打印

标签: python pandas dataframe exception


【解决方案1】:

你也可以试试:

def divide(df):
    if(df['y']!=0):
        return df['x']/df['y']
    else:
        return 0
df['num']=df.apply(divide,axis=1)

但我建议改用这个:

import numpy as np
df['num']=df['x']/df['y']
df.replace(np.inf,0)

【讨论】:

    【解决方案2】:

    试试这个:

    如果您使用的是 python 2.7,则 返回 x/float(y)

    import math
    
    def divide(x,y):
            # if you check type(y) or type(x) you will get type: numpy.float64
            # pandas internally converts it to a numpy.float64
            # when you do division on such values you will get inf as output
            # you can check if values are not zero and do calculations or convert it to float like: x / float(y)
    
            if y and not math.isnan(y):
                return x/y
    
    df['num']  = df.apply(lambda row: divide(row["x"], row["y"]), axis=1)
    
    

    【讨论】:

    • 我使用的是 python 3.7
    • 我运行了代码,但是当一个数字被 0 除时,它给了我 inf 值。也许除法函数不能正常工作
    • x 和 y 都出现在我的 df 中。该公式在将 17 除以 3 之类的数字时有效,但随后将 11 除以 0,它给了我 inf 值。为了解决这个问题,我们编写了异常公式。我想知道为什么这不起作用
    • inf 不是 ZeroDivisionError。它只是给出一个无限的答案。检查 x 和 y 的数据类型。是 numpy.float64 还是 silimar 而不是 float/int?
    【解决方案3】:

    您需要return 的东西,而不是print 的东西,所以它不仅显示,而且还存储在内存中:

    def divide(x,y):
        try:
            return x/y
        except ZeroDivisionError:
            return 0
    
    df['num'] = df.apply(lambda x: divide(x["x"], x["y"]), axis=1)
    

    【讨论】:

    • 好的。感谢您指出我的错误。现在,如果我想创建一个新列并将其应用到我的 df 上,它仍然会给我一个错误。我正在使用:df['num'] = df.apply(divide)
    • @OmerQureshi 编辑了我的答案,如果可行,请接受并投票。
    • 我运行了代码,但它给了我除以 0 的数字的 inf。这正是我想要避免的。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多