Search code examples
pandasdataframedata-sciencemeltdata-munging

melt column by substring of the columns name in pandas (python)


I have dataframe:

         subject           A_target_word_gd  A_target_word_fd B_target_word_gd  B_target_word_fd  subject_type 
           1                      1             2                3                    4             mild 
           2                      11            12               13                  14             moderate

And I want to melt it to a dataframe that will look:

     cond    subject    subject_type     value_type   value
      A         1        mild             gd           1           
      A         1        mild             fg           2           
      B         1        mild             gd           3            
      B         1        mild             fg           4  
      A         2        moderate         gd           11           
      A         2        moderate         fg           12           
      B         2        moderate         gd           13            
      B         2        moderate         fg           14          
...

...

Meaning, to melt based on the delimiter of the columns name.

What is the best way to do that?


Solution

  • One more approach (very similar to what @anky_91 has posted. had already started typing it before he posted, hence putting it out there.)

    new_df =pd.melt(df, id_vars=['subject_type','subject'], var_name='abc').sort_values(by=['subject', 'subject_type'])
    new_df['cond']=new_df['abc'].apply(lambda x: (x.split('_'))[0])
    new_df['value_type']=new_df.pop('abc').apply(lambda x: (x.split('_'))[-1])
    new_df
    

    Output

    subject_type    subject     value   cond    value_type
    0   mild              1     1          A    gd
    2   mild              1     2          A    fd
    4   mild              1     3          B    gd
    6   mild              1     4          B    fd
    1   moderate          2     11         A    gd
    3   moderate          2     12         A    fd
    5   moderate          2     13         B    gd
    7   moderate          2     14         B    fd