Una vez importado un conjunto de datos en pandas puede ser interesante ordenar el contenido de estos. Lo más habitual es ordenarlo en base a los valores de una o varias columnas. Para ordenar dataframes en pandas se pueden utilizar los métodos nativos de estos objetos. Lo que permite hacer esta tarea de un forma sencilla y eficiente.
En esta entrada se va a utilizar el conjunto de datos planetas que se puede encontrar dentro de los conjuntos de datos de seaborn
. La importación de estos datos se puede realizar con el siguiente código.
from seaborn import load_dataset planets = load_dataset("planets") planets.head()
Siendo los cinco primeros registros de este conjunto de datos.
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
Ordenar en base al valor de una columna
La primera tarea siempre es ordenar los conjuntos de datos en base a los valores de una columna. Por ejemplo, se puede ordenar los planetas en base al año de descubrimiento. Lo que se puede conseguir con el método sort()
al que se le ha de indicar el nombre de la columna por la que ordenar. Esto se puede ver en el siguiente ejemplo.
by_year = planets.sort_values('year') by_year.head()
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
Lo primero que se puede observar es el hecho de que los registros se ordenan de forma ascendente. Por lo que los planetas descubiertos recientemente aparecerán al final del nuevo conjunto de datos.
by_year.tail()
method number orbital_period mass distance year 846 Transit 2 15.96540 NaN NaN 2014 847 Transit 2 179.61200 NaN NaN 2014 849 Transit 4 6.16486 NaN NaN 2014 851 Transit 4 23.98020 NaN NaN 2014 840 Transit 3 35.33310 NaN NaN 2014
Ordenar en base al valor de una columna en orden descendente
En el ejemplo anterior, si se quiere tener al principio del conjunto de datos ordenado es necesario cambiar el método de ordenación. Para ello existe la propiedad ascending
que indica si se ordena de forma ascendente. El valor por defecto de esta propiedad es verdadero, por lo que solamente es necesario indicar el valor cuando se desea ordenar en orden descendente. Así para ordenar los planetas por año en orden descendente se puede es necesario escribir.
by_year = planets.sort_values('year',ascending=False) by_year.head()
En donde se observa el resultado deseado.
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
Tener en cuenta los nulos a la hora de ordenar
Si en la columna del conjunto de datos que se esté ordenando existe valores nulos, por defecto estos serán puestos al final. La columna periodo orbital contiene valores nulos, al ordenar por ésta se obtiene.
by_period = planets.sort_values('orbital_period') by_period.head()
method number orbital_period mass distance year 945 Pulsar Timing 1 0.090706 NaN 1200.0 2011 787 Orbital Brightness Modulation 2 0.240104 NaN 1180.0 2011 788 Orbital Brightness Modulation 2 0.342887 NaN 1180.0 2011 794 Transit 1 0.355000 NaN NaN 2013 730 Transit 3 0.453285 NaN 38.7 2011
Pudiéndose comprobar fácilmente que los nulos se sitúan nulos al final.
by_period.tail()
method number orbital_period mass distance year 949 Imaging 1 NaN NaN 120.0 2013 950 Imaging 1 NaN NaN NaN 2010 957 Imaging 1 NaN NaN NaN 2008 1027 Imaging 1 NaN NaN 19.2 2011 1029 Imaging 1 NaN NaN 10.1 2012
Para modificar el orden existe la propiedad na_position
en la que se puede indicar si estos han de estar la principio. Así, para que los nulos sean los primero simplemente se ha de ejecutar la siguiente línea.
by_period = planets.sort_values('orbital_period', na_position='first') by_period.tail()
method number orbital_period mass distance year 900 Imaging 1 40000.0 NaN NaN 2011 644 Imaging 4 69000.0 NaN 39.94 2008 643 Imaging 4 170000.0 NaN 39.94 2008 68 Imaging 1 318280.0 NaN 7.69 2008 937 Imaging 1 730000.0 NaN NaN 2006
Ordenar el propio dataframe
En los ejemplos anteriores se puede ver que al ordenarse los datos se ha creado en todo momento un objeto nuevo. En caso de que no se desee este comportamiento se puede indicar mediante la opción inplace
que se ordene el propio objeto. Con lo que se evita aumentar la memoria consumida por el programa. Así para ordenar por año en el propio objeto se puede emplear.
planets.sort_values('year', inplace=True) planets.head()
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
Ordenar el dataframe en base al índice
En el caso de querer volver a la situación original se puede ordenar el conjunto de datos en base al índice. Lo que requiere utilizar la propiedad sort_index()
, al que por defecto no hay que pasarle ningún parámetro.
planes_sort = planets.sort_index() planes_sort.head()
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
Véase que en este caso los registros se ordenan en base al valor del índice.
Ordenar por los valores de más de una columna
Finalmente puede ser necesario ordenar los valores por más de una columna. Primero por una y luego por otra. Esto se puede hacer indicando al método sort_values()
un vector de columnas en lugar de una cadena de texto. Por ejemplo, se pueden ordenar los planetas por año y periodo orbital el siguiente resultado.
by_year_period = planets.sort_values(['year', 'orbital_period']) by_year_period.head()
method number orbital_period mass distance year 441 Radial Velocity 1 83.888000 11.680 40.57 1989 941 Pulsar Timing 3 25.262000 NaN NaN 1992 942 Pulsar Timing 3 66.541900 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 se puede ver que los planetas descubiertos en el 1992 hay dos que están ordenados por su periodo.
Conclusiones
Saber ordenar dataframes en pandas permiten realizar muchos análisis básicos con los que realizar descubrimientos. Hoy se han visto los métodos disponibles en pandas para realizar esta tarea.
La importancia de saber ordenar conjuntos de datos se puede observar porque todas las plataformas cuentan con estas herramientas. Por ejemplo, en R también existen herramientas para ordenar los conjuntos de datos. O las herramientas que existen en Python para ordenar diccionarios.
Imágenes: Pixabay (Katzenfee50)
No te olvides valorar esta entrada
Suscríbete a nuestro boletín
Suscríbete al boletín semanal para estar al día de todas las publicaciones de Analytics Lane.