Clasificación de índices múltiples en pandas

88

Tengo un conjunto de datos con columnas de índices múltiples en un pandas df que me gustaría ordenar por valores en una columna específica. He intentado usar sortindex y sortlevel pero no he podido obtener los resultados que estoy buscando. Mi conjunto de datos se ve así:

    Group1    Group2
    A B C     A B C
1   1 0 3     2 5 7
2   5 6 9     1 0 0
3   7 0 2     0 3 5 

Quiero ordenar todos los datos y el índice por columna C en el Grupo 1 en orden descendente para que mis resultados se vean así:

    Group1    Group2
    A B C     A B C
 2  5 6 9     1 0 0
 1  1 0 3     2 5 7
 3  7 0 2     0 3 5 

¿Es posible hacer esta clasificación con la estructura en la que se encuentran mis datos, o debería cambiar el Grupo1 al lado del índice?

MattB
fuente

Respuestas:

129

Al ordenar por un MultiIndex, debe contener la tupla que describe la columna dentro de una lista *:

In [11]: df.sort_values([('Group1', 'C')], ascending=False)
Out[11]: 
  Group1       Group2      
       A  B  C      A  B  C
2      5  6  9      1  0  0
1      1  0  3      2  5  7
3      7  0  2      0  3  5

* para no confundir a los pandas haciéndoles pensar que desea ordenar primero por Grupo1 y luego por C.


Nota: Usado originalmente .sortdesde que está obsoleto y luego eliminado en 0.20, a favor de .sort_values.

Andy Hayden
fuente
Gracias, exactamente lo que estaba buscando.
MattB
Hmmph. Más rápido que yo y una mejor solución para arrancar.
DSM
2
Exactamente lo que necesitaba, gracias. Eso no estaba claro en los documentos (al menos no lo encontré). Además, el mensaje de error cuando solamente definir el nivel superior es engañosa: Cannot sort by duplicate column X.
Dr. Jan-Philip Gehrcke
Agradecimiento adicional por agregar la explicación de por qué debemos usar una lista. Deseo que Pandas detecte la lista frente a la tupla e interprete una tupla como una selección de columna y no una lista de columnas ...
Kaushik Ghose
5
@KaushikGhose que suene como que podría ser una buena solicitud de función , supongo que puedes usar loc:df.loc[('Group1', 'C')]
Andy Hayden