脾气暴躁的地方有两个以上的条件

时间:2018-07-12 08:49:38

标签: python pandas numpy dataframe series

早上好

我有一个下面的数据框,其中包含两列整数和一个按以下公式计算的系列(diff):

diff = (df["col_1"] - df["col_2"]) / (df["col_2"])

我想为数据框创建一列,其值是:

  • 如果(diff> = 0)&(diff <= 0.35)等于0
  • 等于1,如果(diff> 0.35)

  • 等于2,如果(diff <0)和(diff> =-0.35)

  • 等于3,如果(diff <-0.35)

我尝试过:

df["Class"] = np.where( (diff >= 0) &  (diff <= 0.35), 0, 
np.where( (diff > 0.35), 1, 
np.where( (diff  < 0) & (diff >=  - 0.35) ), 2, 
np.where( ((diff <  - 0.35), 3) ))) 

但是它报告以下错误:

SystemError: <built-in function where> returned a result with an error set          

我该如何解决?

2 个答案:

答案 0 :(得分:3)

您可以使用numpy.select分别指定条件和值。

s = (df['col_1'] / df['col_2']) - 1

conditions = [s.between(0, 0.35), s > 0.35, s.between(-0.35, 0), s < -0.35]
values = [0, 1, 2, 3]

df['Class'] = np.select(conditions, values, np.nan)

答案 1 :(得分:1)

一个人也可以简单地使用numpy.searchsorted

diff_classes = [-0.35,0,0.35]
def getClass(x):
    return len(diff_classes)-np.searchsorted(diff_classes,x)

df["class"]=diff.apply(getClass)

searchsorted将为您提供x列表中diff_classes的索引,然后将其减去3以得到所需的结果。

编辑:可读性稍差,但它也可以一行显示:

df["class"] = diff.apply(lambda x: 3-np.searchsorted([-0.35,0,0.35],x))