Если всегда есть совпадение между столбцами и каждым значением Field
, используйте DataFrame.lookup
:
s = df['Field']
a = df.columns.str.extract('(' + '|'.join(s) + ')', expand=False)
df['Value'] = df.set_axis(a, axis=1,inplace=False).lookup(df.index, s)
print (df)
Field UKA_rf4 UKB UKDdsdf Value
0 UKA 1 4 54 1
1 UKB 2 5 7787 5
2 UKD 97 54 765656 765656
Аналогичное решение:
df = df.set_index('Field')
a = df.columns.str.extract('(' + '|'.join(s) + ')', expand=False)
df['Value'] = df.set_axis(a, axis=1,inplace=False).lookup(df.index, df.index)
Но проблема с lookup
в том случае, если некоторые значения отсутствуют, поэтому здесь есть альтернатива с DataFrame.melt
для изменения формы, извлеките столбцы с помощью Series.str.extract
со всеми значениями Field
столбец и Series.map
:
df1 = df.melt('Field', var_name='var')
df1['cols'] = df1['var'].str.extract('(' + '|'.join(df['Field']) + ')', expand=False)
s = df1[df1['Field'] == df1['cols']].drop_duplicates('Field').set_index('Field')['value']
df['Value'] = df['Field'].map(s)
print (df)
Field UKA_rf4 UKB UKdsdf Value
0 UKA 1 4 54 1.0
1 UKB1 2 5 7787 NaN
2 UKD 97 54 765656 NaN