通过熊猫使用IF和ELIF功能

时间:2019-01-16 00:43:37

标签: python pandas function

定义一个检查pandas列是否在给定整数范围内的函数的更好方法(如果有)是什么?

我在Pandas数据框中有一列,我想检查这些值是否在设定范围之间。我选择通过创建一个接受数据帧作为参数并使用IF和ELIF测试列是否在范围内的函数来执行此操作。 在范围较小的情况下可以这样做,但是,如果范围较大,则所产生的IF,ELIF函数可能难以维持。有没有更好的方法来实现这一目标?

我的有效代码-

def fn(dframe):
    if dframe['A'] < 125:
        return 935 + 0.2 * dframe['A']

    elif (dframe['A'] >= 955) and (dframe['A'] <= 974):
        return 921.2 + 0.2 * (dframe['A'] - 955)

    elif (dframe['A'] >= 975) and (dframe['A'] <= 1023):
        return 925.2 + 0.2 * (dframe['BCCH'] - 975)

    elif (dframe['A'] >= 511) and (dframe['A'] <= 885):
        return 1805.2 + 0.2 * (dframe['A'] - 512)

此代码可以正常工作,但是如果范围较大,则结果函数将难以管理。

编辑:

感谢@ ycx,@ Jorge和所有人,我喜欢您代码的可读性。但是,我想知道是否像@ycx的方法一样,如果我在csv文件中拥有“ condlist”的最小值和最大值,例如

condlist_from_CSV_file

然后我可以将其读入数据框。现在,我想检查另一个数据帧中列“ A”的每一行是否在这些限制之间,如果为true,则返回相应的“选择”,否则返回“无”有意义吗? 所需的输出-

output dataframe with check

以此类推。

2 个答案:

答案 0 :(得分:0)

似乎您需要np.where

import numpy as np
np.where(dframe['A'] < 125, 935 + 0.2 * dframe['A'],
       np.where(dframe['A'] >= 511) & (dframe['A'] <= 885), 1805.2 + 0.2 * (dframe['A'] - 512,
       np.where(dframe['A'] <= 974, 921.2 + 0.2 * (dframe['A'] - 955),
       np.where(dframe['A'] <= 1023, 925.2 + 0.2 * (dframe['A'] - 975),
    'Value for any other value'))))

答案 1 :(得分:0)

您可以使用np.select来管理您的条件和选项。这样一来,您可以轻松维护条件和选项,并利用numpy库函数来加快代码执行速度

def fn(dframe):
    import numpy as np
    condlist = [
            dframe['A'] < 125, 
            (dframe['A'] >= 955) and (dframe['A'] <= 974),
            (dframe['A'] >= 975) and (dframe['A'] <= 1023),
            (dframe['A'] >= 511) and (dframe['A'] <= 885),
            ]
    choicelist = [
            935 + 0.2 * dframe['A'],
            921.2 + 0.2 * (dframe['A'] - 955),
            925.2 + 0.2 * (dframe['BCCH'] - 975),
            1805.2 + 0.2 * (dframe['A'] - 512),
            ]
    output = np.select(condlist,choicelist)
    return output