You can do this using np.where , as shown below. I think it will be more effective.
import numpy as np import pandas as pd df = pd.DataFrame([['1990', 'a', 5, 4, 7, 2], ['1991', 'c', 10, 1, 2, 0], ['1992', 'd', 2, 1, 4, 12], ['1993', 'a', 5, 8, 11, 6]], columns=('Date', 'best', 'a', 'b', 'c', 'd')) arr = df.best.values cols = df.columns[2:] for col in cols: arr2 = df[col].values arr = np.where(arr==col, arr2, arr) df.drop(columns=cols, inplace=True) df["values"] = arr df
Result
Date best values 0 1990 a 5 1 1991 c 2 2 1992 d 12 3 1993 a 5
Dev khadka
source share