早上好
我有一个下面的数据框,其中包含两列整数和一个按以下公式计算的系列(diff):
diff = (df["col_1"] - df["col_2"]) / (df["col_2"])
我想为数据框创建一列,其值是:
等于1,如果(diff> 0.35)
等于2,如果(diff <0)和(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
我该如何解决?
答案 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))