En los DataFrames de Pandas se pueden ordenar los registros en base a los valores es estos utilizando el método sort_values()
. Este método permite ordenar en base a una o varias columnas, tanto de forma ascendente como descendente, e indicar cómo se deben tratar los valores nulos. Veamos cómo se puede usar este método para ordenar valores en Pandas, para ello primero se mostrará la sintaxis del método y luego se mostrarán algunos ejemplos.
Tabla de contenidos
El método sort_values()
de Pandas
En Pandas el método sort_values()
se emplea para ordenar un DataFrame según los valores de una o más columnas. Su sintaxis es la siguiente:
DataFrame.sort_values(by, ascending=True, inplace=False, na_position='last', ignore_index=False, kind='quicksort' axis=0)
El significado de cada uno de los parámetros del método es el siguiente:
by
: este es el único parámetro obligatorio en el que se debe indicar el nombre de la columna o columnas con las que se desea ordenar el conjunto de datos. En el caso de ordenar solamente por una columna se debe indicar la etiqueta de esta, mientras que si se desea ordenar por dos o más se debe indicar una lista con las etiquetas en el orden que se desea utilizar para ordenar.ascending
: con esta opción booleana se puede seleccionar cómo se ordenarán los valores. Por defecto el valor esTrue
y los registros se ordenarán de forma ascendente, en caso de que se desee ordenar los valores de forma descendente se debe indicar el valorFalse
.inplace
: a través de esta opción se puede indicar si se creará un nuevo DataFrame ordenado o se modificará el actual. El valor por defecto esFalse
, por lo que se crea un nuevo DataFrame. Al trabajar con grandes conjuntos de datos es recomendable cambiar el valor por defecto aTrue
para no tener en memoria dos copias de los valores. Además, cuando se modifica el DataFrame no es necesario asignar el resultado a una nueva variable.na_position
: mediante este parámetro opcional se le indica al método dónde colocar los valores NaN en el DataFrame ordenado. Puede tomar dos valores:'last'
para colocar los NaN al final o'first'
para colocarlos al principio. Por defecto, los NaN se colocan al final.ignore_index
: con este parámetro se puede indicar si se deben crear nuevos índices del DataFrame resultante. Por defecto el valor esFalse
, por lo que se mantienen los índices. Para modificarlos es necesario asignar el valorTrue
.kind
: usando este parámetro opcional se puede especificar el algoritmo de ordenación a utilizar. El parámetro solamente puede tomar uno de los siguientes valores: ‘quicksort’ (predeterminado), ‘mergesort’, ‘heapsort’ o cualquier función de ordenación válida. El valor predeterminado funciona bien en la mayoría de los casos, por lo que es poco habitual modificarlo, y cada algoritmo tiene diferentes propiedades de rendimiento y estabilidad.axis
: mediante este parámetro se puede indicar si se desea ordenar por filas (opción predeterminada) o por columnas (se debe indicar 1). Este es un parámetro poco usado ya que la opción más habitual es la predeterminada.
Ejemplo de uso de sort_values()
para ordenar valores en Pandas
El uso básico de sort_values()
es ordenar los conjuntos de datos en los DataFrames en base a una columna. Para ello solamente se debe usar el método indicando la columna en base a la cual se desea ordenar los datos. A modo de ejemplo se va a usar el conjunto de datos “planets” de Seaborn que contiene información de los exoplanetas descubiertos hasta 2014. Un conjunto de datos que ya se ha usado varías veces en la serie especial de publicaciones sobre la librería Seaborn. Para importar el conjunto de datos y ordenarlo en base al año de descubrimiento se puede usar el siguiente código.
import seaborn as sns import pandas as pd # Cargar el dataset "planets" de Seaborn planets_data = sns.load_dataset("planets") # Mostrar las primeras filas del dataset sin ordenar print("Dataset sin ordenar:") print(planets_data.head()) # Ordenar el dataset por 'year' planets_data_sorted = planets_data.sort_values(by=['year']) # Mostrar las primeras filas del dataset ordenado print("\nDataset ordenado por 'year':") print(planets_data_sorted.head())
Dataset sin ordenar: method number orbital_period mass distance year 0 Radial Velocity 1 269.300 7.10 77.40 2006 1 Radial Velocity 1 874.774 2.21 56.95 2008 2 Radial Velocity 1 763.000 2.60 19.84 2011 3 Radial Velocity 1 326.030 19.40 110.62 2007 4 Radial Velocity 1 516.220 10.50 119.47 2009 Dataset ordenado por 'year' y luego por 'orbital_period': method number orbital_period mass distance year 441 Radial Velocity 1 83.888000 11.680 40.57 1989 942 Pulsar Timing 3 66.541900 NaN NaN 1992 941 Pulsar Timing 3 25.262000 NaN NaN 1992 943 Pulsar Timing 3 98.211400 NaN NaN 1994 16 Radial Velocity 1 4.230785 0.472 15.36 1995
En este ejemplo se han importado las librerías necesarias y el conjunto de datos. A continuación, se muestra el conjunto de datos sin ordenar y el conjunto de datos ordenado en base al año de descubrimiento de los exoplanetas ('year'
). Observándose que los datos se ordenan de forma ascendente.
Ordenar los valores de orden descendente
Si se desean mostrar los exoplanetas en base al año de descubrimiento, pero en orden descendente solamente se debe asignar el valor False
a la propiedad ascending
del método. Esto es lo que se muestra en el siguiente ejemplo.
# Ordenar el dataset por 'year' en orden descendente planets_data_sorted = planets_data.sort_values(by=['year'], ascending=False) # Mostrar las primeras filas del dataset ordenado print("\nDataset ordenado por 'year' en orden descendente:") print(planets_data_sorted.head())
Dataset ordenado por 'year' y luego por 'orbital_period': method number orbital_period mass distance year 852 Transit 4 43.84450 NaN NaN 2014 890 Transit 2 2.42629 NaN NaN 2014 440 Radial Velocity 1 3827.00000 0.48 20.48 2014 895 Transit 1 68.95840 NaN NaN 2014 894 Transit 1 2.46502 NaN NaN 2014
Nótese que en el año 2014 se han descubierto más plantas, por lo que los cinco primeros registros que muestra head()
pertenecen todos a este año. Aunque es posible usar otra columna como segundo criterio de ordenación.
Ordenar los valores en base a dos columnas
La ordenación por dos o más columnas se puede obtener indicando en el parámetro by
una lista con los nombres de estas. El método ordenara el primer lugar en base a la primera columna indicada y, cuando los valores son similares se ordenará en base a la segunda columna y siguientes. Por ejemplo, se pueden ordenar los datos en base al año ('year'
) y periodo orbital ('orbital_period'
) como se muestra a continuación.
# Ordenar el dataset primero por 'year' y luego por 'orbital_period' planets_data_sorted = planets_data.sort_values(by=['year', 'orbital_period'], ascending=False) # Mostrar las primeras filas del dataset ordenado print("\nDataset ordenado por 'year' y luego por 'orbital_period':") print(planets_data_sorted.head())
Dataset ordenado por 'year' y luego por 'orbital_period': method number orbital_period mass distance year 440 Radial Velocity 1 3827.0 0.48 20.48 2014 501 Radial Velocity 2 3452.0 2.58 68.54 2014 893 Radial Velocity 2 3000.0 NaN NaN 2014 829 Radial Velocity 2 1460.0 NaN NaN 2014 742 Radial Velocity 4 982.0 NaN NaN 2014
Obteniendo como resultado un conjunto de datos ordenado por año y en segundo lugar por el pedido orbital. En este caso, los planetas para los que no se conoce el periodo orbital aparecerán al final de la lista, pero este comportamiento se puede cambiar con el parámetro na_position
.
Ordenar los valores nulos al principio
Si se asigna al parámetro na_position
el valor 'first'
los valores con NaN
se mostrarán al principio. Lo que se puede ver en el siguiente ejemplo.
# Ordenar el dataset primero por 'year' y 'orbital_period' mostrando NaN al principio planets_data_sorted = planets_data.sort_values(by=['year', 'orbital_period'], ascending=False, na_position='first') # Mostrar las primeras filas del dataset ordenado print("\nDataset ordenado con valores NaN al principio:") print(planets_data_sorted.head())
Dataset ordenado por 'year' y luego por 'orbital_period': method number orbital_period mass distance year 749 Transit Timing Variations 3 NaN NaN NaN 2014 440 Radial Velocity 1 3827.0 0.48 20.48 2014 501 Radial Velocity 2 3452.0 2.58 68.54 2014 893 Radial Velocity 2 3000.0 NaN NaN 2014 829 Radial Velocity 2 1460.0 NaN NaN 2014
En este caso el único planeta descubierto en 2014 del que se desconocía el periodo orbital se muestra al principio de la lista.
Restablecer los índices del DataFrame
Por defecto, al reordenar los elementos del DataFrame, los índices se conservan. Para asignar unos nuevos índices se puede usar la propiedad ignore_index
, a la que se le debe asignar el valor True
. Lo que se puede ver en el siguiente ejemplo.
# Ordenar el dataset por 'year' y restableciendo los índices planets_data_sorted = planets_data.sort_values(by=['year'], ignore_index=True) # Mostrar las primeras filas del dataset ordenado print("\nDataset ordenado por 'year' y restableciendo los índices:") print(planets_data_sorted.head())
Dataset ordenado por 'year' y restableciendo los índices: method number orbital_period mass distance year 0 Radial Velocity 1 83.888000 11.680 40.57 1989 1 Pulsar Timing 3 66.541900 NaN NaN 1992 2 Pulsar Timing 3 25.262000 NaN NaN 1992 3 Pulsar Timing 3 98.211400 NaN NaN 1994 4 Radial Velocity 1 4.230785 0.472 15.36 1995
Nótese que ahora los índices comienzan por 0 y están ordenados. No como antes cuando se conservaban los valores originales.
Conclusiones
En esta entrada se ha visto la sintaxis del método de los DataFrames sort_values()
con el que se puede ordenar valores en Pandas. Un método que es extremadamente útil para el preprocesado de los datos. Se ha visto cómo ordenar los valores en base una columna, a varias columnas y cambiar el método de ordenación. Además, se ha visto cómo modificar la prioridad de los valores NaN y restablecer los índices del DataFrame. Con lo que se ha cubierto la mayoría de posibles las aplicaciones de este método.
Image by Džoko Stach from Pixabay
Deja una respuesta