Remodelar de ancho a largo en pandas

Supongamos que tengo el siguiente dataframe en pandas:

AA BB CC date 05/03 1 2 3 06/03 4 5 6 07/03 7 8 9 08/03 5 7 1 

Y quiero transformarlo en lo siguiente:

  AA 05/03 1 AA 06/03 4 AA 07/03 7 AA 08/03 5 BB 05/03 2 BB 06/03 5 BB 07/03 8 BB 08/03 7 CC 05/03 3 CC 06/03 6 CC 07/03 9 CC 08/03 1 

¿Cómo puedo hacerlo?

La razón de la transformación de ancho a largo es que, en la siguiente etapa, me gustaría fusionar este dataframe con otro basado en las fechas y los nombres de las columnas iniciales (AA, BB, CC).

    unstack devuelve una serie con un multiindex:

      In [38]: df.unstack() Out[38]: date AA 05/03 1 06/03 4 07/03 7 08/03 5 BB 05/03 2 06/03 5 07/03 8 08/03 7 CC 05/03 3 06/03 6 07/03 9 08/03 1 dtype: int64 

    Puede llamar a reset_index en la serie que regresa:

     In [39]: df.unstack().reset_index() Out[39]: level_0 date 0 0 AA 05-03 1 1 AA 06-03 4 2 AA 07-03 7 3 AA 08-03 5 4 BB 05-03 2 5 BB 06-03 5 6 BB 07-03 8 7 BB 08-03 7 8 CC 05-03 3 9 CC 06-03 6 10 CC 07-03 9 11 CC 08-03 1 

    O construya un dataframe con un índice múltiple:

     In [40]: pd.DataFrame(df.unstack()) Out[40]: 0 date AA 05-03 1 06-03 4 07-03 7 08-03 5 BB 05-03 2 06-03 5 07-03 8 08-03 7 CC 05-03 3 06-03 6 07-03 9 08-03 1 

    Usa pandas.melt para transformar de ancho a largo:

     df = pd.DataFrame({ 'date' : ['05/03', '06/03', '07/03', '08/03'], 'AA' : [1, 4, 7, 5], 'BB' : [2, 5, 8, 7], 'CC' : [3, 6, 9, 1] }) df 

    entonces nosotros tenemos:

      date AA BB CC 0 05/03 1 2 3 1 06/03 4 5 6 2 07/03 7 8 9 3 08/03 5 7 1 

    Ahora establezca el índice para que tengamos exactamente el mismo df que el suyo:

     df = df.set_index('date') df 

    Nos da:

      AA BB CC date 05/03 1 2 3 06/03 4 5 6 07/03 7 8 9 08/03 5 7 1 

    Para convertir, solo necesitamos restablecer el índice y luego fundir:

     df = df.reset_index() pd.melt(df, id_vars='date', value_vars=['AA', 'BB', 'CC']) 

    Este es el resultado final:

      date variable value 0 05/03 AA 1 1 06/03 AA 4 2 07/03 AA 7 3 08/03 AA 5 4 05/03 BB 2 5 06/03 BB 5 6 07/03 BB 8 7 08/03 BB 7 8 05/03 CC 3 9 06/03 CC 6 10 07/03 CC 9 11 08/03 CC 1