Cómo ordenar el marco de datos de pandas de una columna

237

Tengo un marco de datos como este:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0

Como puede ver, los meses no están en orden de calendario. Entonces creé una segunda columna para obtener el número de mes correspondiente a cada mes (1-12). A partir de ahí, ¿cómo puedo ordenar este marco de datos según el orden de los meses calendario?

Sachila Ranawaka
fuente

Respuestas:

326

Use sort_valuespara ordenar el df por los valores de una columna específica:

In [18]:
df.sort_values('2')

Out[18]:
        0          1     2
4    85.6    January   1.0
3    95.5   February   2.0
7   104.8      March   3.0
0   354.7      April   4.0
8   283.5        May   5.0
6   238.7       June   6.0
5   152.0       July   7.0
1    55.4     August   8.0
11  212.7  September   9.0
10  249.6    October  10.0
9   278.8   November  11.0
2   176.5   December  12.0

Si desea ordenar por dos columnas, pase una lista de etiquetas de columna sort_valuescon las etiquetas de columna ordenadas según la prioridad de clasificación. Si lo usa df.sort_values(['2', '0']), el resultado se ordenaría por columna y 2luego por columna 0. Por supuesto, esto realmente no tiene sentido para este ejemplo porque cada valor en df['2']es único.

EdChum
fuente
75

Probé las soluciones anteriores y no logro resultados, así que encontré una solución diferente que funciona para mí. El ascendente = Falso es ordenar el marco de datos en orden descendente , por defecto es Verdadero . Estoy usando python 3.6.6 y pandas 0.23.4 versiones.

final_df = df.sort_values(by=['2'], ascending=False)

Puede ver más detalles en la documentación de pandas aquí .

Joel Carneiro
fuente
9

Simplemente agregue algunas operaciones más en los datos. Supongamos que tenemos un marco de datos df, podemos hacer varias operaciones para obtener los resultados deseados

ID         cost      tax    label
1       216590      1600    test      
2       523213      1800    test 
3          250      1500    experiment

(df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)

dará sortedsalida de etiquetas como undataframe

    index   label
0   test        2
1   experiment  1
Harry_pb
fuente
7

Solo como otra solución:

puede clasificar sus datos de cadena (nombre del mes) y ordenarlos de esta manera:

df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)

Le dará los datos ordenados month namesegún lo especificado al crear el Categoricalobjeto.

alireza yazdandoost
fuente