Ordenamiento de datos con Pandas

Publicado por Andrea Navarro en

En este artículo veremos las herramientas que ofrece Pandas para ordenar los datos de nuestros DataFrames, tipos de ordenamiento y ordenamiento de campos especiales.

Para los ejemplos ejemplos de este artículo utilizaremos un archivo CSV que contiene las columnas nombre, apellido, fecha_nacimiento y puntaje.

Primero cargaremos este archivo y lo convertiremos en DataFrames para poder ordenarlo.

import pandas as pd
df = pd.read_csv("datos_personas.csv")

Ordenamiento por una columna

Utilizando la función sort_values es posible ordenar los datos de un DataFrame especificando la columna por la cual se quiere ordenar con el parámetro by.

df_ordenado = df.sort_values(by="puntaje")

Esto ordenará los registros del DataFrame por los valores de la columna puntaje.

36        Gary     Bell       1996-05-23     0.26
6    Alejandro   Garner       1960-06-09     2.13
20  Kristopher    Smith       1999-10-25     4.14
23    Courtney   Dalton       1986-09-17     5.47
17       Damon   Howell       1989-10-17     7.11

El resultado del ordenamiento se guardará en la variable df_ordenado pero no modificará el DataFrame original.

En el caso de números enteros o flotantes el orden se hará de menor a mayor (orden ascendente), en el caso de valores string el orden se hará en forma alfabética.

df_ordenado = df.sort_values(by="nombre")
       nombre apellido fecha_nacimiento  puntaje
6   Alejandro   Garner       1960-06-09     2.13
11       Alex   Carter       1987-11-20    62.58
12     Alicia  Richard       1979-07-06    76.51
10     Andrew   Wilson       1966-01-24    59.76
22   Angelica  Sanders       1964-12-07    58.26

Ordenamiento por fecha

Cuando un campo del DataFrame es un formato fecha, hora o fecha-hora es necesario verificar que el campo sea reconocido como tal para que no sea ordenado como si fuese una cadena de caracteres. Para verificarlo se utiliza el atributo dtype de la columna.

df["fecha_nacimiento"].dtype

Si el valor de este atributo es diferente a datetime64[ns] el campo se reconoce como algo diferente a una fecha. Para modificar el tipo de la columna se utiliza la función to_datetime.

df["fecha_nacimiento"] = pd.to_datetime(df["fecha_nacimiento"])

Una vez realizada esta modificación es posible ordenar la columna correctamente.

df_ordenado = df.sort_values(by="fecha_nacimiento")
       nombre apellido fecha_nacimiento  puntaje
6   Alejandro   Garner       1960-06-09     2.13
27   Samantha    Davis       1960-07-28    25.25
15      Kelly    Olson       1961-11-11     9.32
21     Hannah   Wilson       1962-06-03    13.67
0      Daniel     West       1962-11-09    65.14

Ordenamiento de valores nulos

Por defecto, los NaN de un DataFrame se colocan al final si se ordena de forma ascendente y al principio si se ordena en forma descendente. Esto puede modificarse con el parámetro na_position utilizando los valores first o last.

df_ordenado = df.sort_values(by="puntaje", na_position="first")

En este ejemplo se ordenará por puntaje de forma ascendente pero los valores nulos se colocarán al principio.

   nombre  apellido fecha_nacimiento  puntaje
14     Beverly  Jacobson       1989-05-03      NaN
22    Angelica   Sanders       1964-12-07      NaN
36        Gary      Bell       1996-05-23     0.26
6    Alejandro    Garner       1960-06-09     2.13
20  Kristopher     Smith       1999-10-25     4.14

Ordenamiento descendente

Por defecto el ordenamiento se hará de forma descendente, si en cambio se quiere hacer de forma ascendente se debe agregar el parámetro ascending configurándolo a falso.

df_ordenado = df.sort_values(by="apellido", ascending=False)

En este caso el DataFrame se ordenará alfabéticamente pero de modo inverso.

     nombre apellido fecha_nacimiento  puntaje
10   Andrew   Wilson       1966-01-24    59.76
21   Hannah   Wilson       1962-06-03    13.67
48    Debra    White       1967-04-12    30.40
0    Daniel     West       1962-11-09    65.14
32  Leonard    Weiss       1977-07-30    15.90

Ordenamiento por multiples columnas

Para modificar por múltiples columnas se provee al parámetro by con una lista conteniendo los nombres de las columnas por las cual se quiere ordenar. El orden de estos elementos configurará la prioridad en la que se ordenará el DataFrame.

df_ordenado = df.sort_values(by=["apellido", "nombre"])

El DataFrame se ordenará alfabéticamente por apellido y en los casos que varias columnas tengan el mismo apellido entonces estas serán ordenadas por nombre.

     nombre apellido fecha_nacimiento  puntaje
18   Joseph  Alvarez       2003-03-20    54.06
45   Adrian   Austin       1978-03-17    90.85
50    Scott   Austin       1978-04-27    93.85
36     Gary     Bell       1996-05-23     0.26
29  Matthew    Brown       2002-10-21    13.33

En el caso de requerir diferentes ordenamientos para las columnas el orden puede ser especificado como una lista donde se especifica como ascendente o descendente correspondiente para cada columna.

df_ordenado = df.sort_values(by=["apellido", "puntaje"], ascending=[True, False])

En este ejemplo el apellido se ordenará de manera ascendente mientras que la siguiente prioridad de ordenamiento, el puntaje, se hará de forma descendente.

 nombre apellido fecha_nacimiento  puntaje
18   Joseph  Alvarez       2003-03-20    54.06
50    Scott   Austin       1978-04-27    93.85
45   Adrian   Austin       1978-03-17    90.85
36     Gary     Bell       1996-05-23     0.26
29  Matthew    Brown       2002-10-21    13.33

Ordenar por índice

En Pandas, el índice identifica de forma única cada fila y permite acceder, y organizar los datos eficientemente. Aunque por defecto es numérico, puede personalizarse con fechas, nombres u otras etiquetas. Es posible ordenar un DataFrame por índice utilizando la función sort_index.

df_ordenado = df.sort_index()
   nombre  apellido fecha_nacimiento  puntaje
0  Daniel      West       1962-11-09    65.14
1   Jason  Campbell       1968-11-19    21.23
2   Karen    Sutton       1999-08-26    82.56
3  Robert      Sims       1965-08-15    56.97
4    Omar    Taylor       1975-01-27    73.61

Ordenamiento sin copia

Por defecto sort_values dará como resultado un DataFrame con los valores ordenados. Si se quiere modificar el mismo DataFrame con el que se está trabajando se debe agregar el parámetro inplace configurado a True.

df.sort_values(by="nombre", inplace=True)

En este artículo hemos visto cómo ordenar datos en Pandas utilizando tanto columnas como el índice, explorando casos comunes como el ordenamiento por valores numéricos, fechas o múltiples criterios.


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora