[英]More Succinct Elif Statement
有沒有一種方法可以更有效地對此進行編碼? 我嘗試了np.where,但是條件太多了,而且它們是如此復雜,以至於無法正常工作。 我知道必須有一條比大規模的elif語句更快的方法,但這是我可以在其中轉儲所有條件的唯一方法。 我正在運行大約一百萬行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)
@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
一個有用的習慣用法是立即處理返回的子句。 那么您不需要 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:
您可以將的第一個條件與and
結合使用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.