有没有办法更有效地编码?我尝试了np.where但是有很多条件而且它们非常复杂,我无法让它正常工作。我知道必须有一个更快的方式,然后一个大规模的elif声明,但它是我可以在那里转储所有条件的唯一方法。我正在运行大约100万行excel,所以如果还有其他更快的选择,我希望听到它们!
以下是代码:
def pol_cost(x):
if ( 9500000> x.CRV >= 50 ):
if (x.MDI > MDI_var):
if (x.CI < 40 ):
return x.CRV
elif (60 <= x.CI <80):
return x.CRV*((100-x.CI)/(100-var_var))**x.Cost_Escalation_N
else:
return 0
else:
return 0
df1['Policy_Cost_Y1'] = df1.apply(pol_cost, axis = 1)
答案 0 :(得分:4)
@chepner简化条件语句允许您将整个操作矢量化为
a = x.CI < 40
b = numpy.logical_and(
60 <= x.CI,
x.CI < 80,
)
c = numpy.logical_or(
numpy.logical_and(
9500000 > x.CRV,
x.CRV >= 50
),
x.MDI <= MDI_var,
)
tmp = numpy.zeros_like(x.CRV)
tmp[a] = x.CRV[a]
tmp[b] = x.CRV[b] * ((100-x.CI[b])/(100 - var_var))**x.Cost_Escalation_N[b],
tmp[c] = 0
df1['Policy_Cost_Y1'] = tmp
答案 1 :(得分:2)
一个有用的习惯用法是立即处理返回的子句;然后你不需要 else
或elif
。
def pos_cost(x):
if not (9500000 > x.CRV >= 50):
return 0
if x.MDI <= MDI_var:
return 0
if x.CI < 40:
return x.CRV
elif 60 < x.CI < 80:
return x.CRV * ((100-x.CI)/(100 - var_var))**x.Cost_Escalation_N
df1['Policy_Cost_Y1'] = df1.apply(pol_cost, axis=1)
请注意,由于前两个if
语句具有相同的结果,因此您可以将它们合并为一个语句:
if not (9500000 > x.CRV >= 50) or (x.MDI <= MDI_var):
return 0
或经过一点点操纵后:
if 9500000 <= x.CRV or x.CRV < 50 or x.MDI <= MDI_var:
答案 2 :(得分:0)
您可以将两个第一个条件与and
结合使用,并测试其相反值。然后使用elif
语句。
if not (9500000 > x.CRV >= 50 and x.MDI > MDI_var):
return 0
elif x.CI < 40 :
return x.CRV
elif 60 <= x.CI <80:
return x.CRV*((100-x.CI)/(100-var_var))**x.Cost_Escalation_N
else:
df1['Policy_Cost_Y1'] = df1.apply(pol_cost, axis = 1)