I would like to reverse a dataframe with dummy variables. For example,
from df_input:
Course_01 Course_02 Course_03 
  0           0         1 
  1           0         0 
  0           1         0 
To df_output
   Course
0 03
1 01
2 02
I have been looking at the solution provided at Reconstruct a categorical variable from dummies in pandas but it did not work. Please, Any help would be much appreciated.
Many Thanks, Best Regards, Carlo
We can use wide_to_long, then select rows that are not equal to zero i.e 
ndf = pd.wide_to_long(df, stubnames='T_', i='id',j='T')
      T_
id  T     
id1 30   0
id2 30   1
id1 40   1
id2 40   0
not_dummy = ndf[ndf['T_'].ne(0)].reset_index().drop('T_',1)
   id   T
0  id2  30
1  id1  40
Update based on your edit :
ndf = pd.wide_to_long(df.reset_index(), stubnames='T_',i='index',j='T')
not_dummy = ndf[ndf['T_'].ne(0)].reset_index(level='T').drop('T_',1)
        T
index    
1      30
0      40
                        You can use:
#create id to index if necessary
df = df.set_index('id')
#create MultiIndex
df.columns = df.columns.str.split('_', expand=True)
#reshape by stack and remove 0 rows
df = df.stack().reset_index().query('T != 0').drop('T',1).rename(columns={'level_1':'T'})
print (df)
    id   T
1  id1  40
2  id2  30
EDIT:
col_name = 'Course' 
df.columns = df.columns.str.split('_', expand=True)
df = (df.replace(0, np.nan)
        .stack()
        .reset_index()
        .drop([col_name, 'level_0'],1)
        .rename(columns={'level_1':col_name})
)
print (df)
  Course
0     03
1     01
2     02
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With