Вы можете просто использовать для этого словарь:
vals = [0.5, 0.2, 0.3, 0.4];
convDict = {i+1:val for i,val in enumerate(vals)} # +1 because you used 1 as the base
df['D'] = df['B'].map(convDict)
Если у вас действительно есть фрейм данных, как вы показали на изображении, которое вы предоставили, где все записи столбцов от c1 до c4 равны, вы можете заменить vals на:
vals = df.loc[0,'C1':'C4'].values
Если значения в c1 по c4 не равны, я бы использовал следующий подход:
A = df.loc[:,['C1':'C4']].values
y = df['B'].values.astype(int)-1
x = np.arange(len(y)).astype(int)
df['D'] = A[x,y]