Существует встроенная функция lookup
, которая может обрабатывать этот тип ситуации (смотрит по строке / столбцу). Я не знаю, насколько он оптимизирован, но может быть быстрее, чем применяемое решение.
In [9]: df['value'] = df.lookup(df.index, df['best'])
In [10]: df
Out[10]:
Date best a b c d value
0 1990 a 5 4 7 2 5
1 1991 c 10 1 2 0 2
2 1992 d 2 1 4 12 12
3 1993 a 5 8 11 6 5