【发布时间】:2019-01-16 00:43:37
【问题描述】:
有什么更好的方法(如果有的话)来定义一个检查 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”列的每一行是否在这些限制之间,如果为真,则返回相应的“选择”,否则返回“无”这有意义吗? 期望的输出 -
等等..
【问题讨论】:
-
第二个 ELIF 中的 dframe['BCCH'] 是错字吗?
-
不属于任何范围的值会发生什么? (例如,130。)
-
您的代码应该会失败,因为
if some_series < 125未定义.. 自己尝试一下..if pd.Series([1, 2, 3]) < 125: print('hello')给出(正确)ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().请提供 minimal reproducible example。 -
Jorge - 抱歉,是的意思是 dframe['A'] 而不是 dframe['BCCH']
-
NPE - 如果条件都不成立,则返回“无”