Попробуйте следующее:
FINAL['expiry_number'] = '0'
for c in '321':
FINAL.loc[FINAL['EXPIRY_DT'] == FINAL['Expiry'+c], 'expiry_number'] = c
FINAL['Expiry_encodings'] = FINAL['SYMBOL'].astype(str) + '_' + \
FINAL['INSTRUMENT'].astype(str) + '_' + FINAL['STRIKE_PR'].astype(str) + \
'_' + FINAL['OPTION_TYP'].astype(str) + '_' + FINAL['expiry_number']
Это позволяет избежать трех операторов if
, имеет значение по умолчанию ('0'
), если ни один из операторов if не оценивается как True
, и позволяет избежать форматирования всех строк; Кроме того, он также избегает метода apply
с lambda
.
Примечание по порядку '321'
: это отражает порядок, в котором оценивается цепочка if в исходном разделе кода: 'Expiry3'
имеет самый низкий приоритет, и в моем коде, приведенном здесь, он сначала переопределяется на # 2, а затем № 1. Исходная цепочка if будет ярлыком на # 1, учитывая, что это самый высокий приоритет. Например, если 'Expiry1'
и 'Expiry3'
имеют одинаковое значение (равное 'EXPIRY_DT'
), назначенное значение будет 1
, а не 3
.