Ordenamiento de datos con Pandas
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.