Вы можете использовать это
df1 = df.filter(like='key').stack().reset_index().rename(columns={'level_0':'id','level_1':'keys',0:'key_val'})
df2 = df.filter(like='value').stack().reset_index().rename(columns={'level_0':'id','level_1':'valnum',0:'val'})
(df1.merge(df2,on ='id',how='outer', left_index=True, right_index=True).pivot('id','key_val','val')
.reset_index()
.rename_axis(None, axis=1)
.drop('None',axis=1))
Выход
id Age Colour Condition Price Shape
0 0 NaN Blue NaN 3 Square
1 1 4 Red New 5 NaN