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?

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.