Here is an toy-example of transforming df into df_f (basically it is kind of wide to long transform).
I wonder if it could be done in more cleaner, concise and direct way?
import pandas as pd
df = pd.DataFrame({'x': ['a', 'b', 'c'], 'A': [1,2,3], 'B':[7,8,9]})
     x  A   B
 0   a  1   7
 1   b  2   8
 2   c  3   9
cols_to_stack = ['A', 'B']
df_s = df[cols_to_stack].stack().rename_axis(('idx', 'c')).reset_index(name='value')
    idx c   value
0   0   A   1
1   0   B   7
2   1   A   2
3   1   B   8
4   2   A   3
5   2   B   9
df_ind = df[['x']] #there could be more columns than x, but we can assume that will be df.columns "minus" col_to_stack
df_f = pd.merge(df_s, df_ind, how='left', left_on='idx', right_index=True).drop(columns=['idx'])
    c value x
0   A   1   a
1   B   7   a
2   A   2   b
3   B   8   b
4   A   3   c
5   B   9   c
