定义一个检查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”的最小值和最大值,例如
然后我可以将其读入数据框。现在,我想检查另一个数据帧中列“ A”的每一行是否在这些限制之间,如果为true,则返回相应的“选择”,否则返回“无”有意义吗? 所需的输出-
以此类推。
答案 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