Revista Informática

Diferentes formas de ordenar dataframes en pandas

Publicado el 29 abril 2019 por Daniel Rodríguez @analyticslane

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.

Contenido relacionado


Volver a la Portada de Logo Paperblog