Python

Segmentar datos numéricos en Pandas con la función cut()

Al trabajar con datos numéricos, para facilitar su análisis e interpretación, puede ser necesario agrupar estos en intervalos de valores discretos. Lo que permite convertir datos numéricos en categorías o clases. La función cut permite segmentar datos numéricos en Pandas de una manera sencilla.

Descripción de la función cut() de Pandas

La función cut() de Pandas permite dividir los valores numéricos de la series de datos en contenedores o bins, donde cada uno de estos bins representa un intervalo de valores. Lo que permite categorizar los datos de una forma significativa. Algo que es especialmente útil durante las fases de análisis y visualización de los datos, ya que permite representar la información de una manera más clara.

Uso básico de la función cut() de Pandas

La función cut() de Pandas requiere que se le indiquen dos parámetros para poder funcionar: los valores que se desea segmentar y los límites de los contenedores o bins. En ambos casos se pueden usar cualquier elemento que represente una serie de listas.

A modo de ejemplo, para ver el funcionamiento de esta función se puede usar el conjunto de datos planets de Seaborn que contiene diferentes características de exoplanetas (un conjunto que ya se ha usado para explicar cómo ordenar valores o crear gráficos de correlación). Como puede ser la columna mass que incluye la masa de los exoplanetas. Si se desea segmentar los registros en base a la masa solamente se tiene que definir un rango de valores y llamar a la función cut() para que realice la tarea. Esto es lo que se hace en el siguiente ejemplo.

import seaborn as sns
import pandas as pd

# Cargar el dataset "planets" de Seaborn
planets_data = sns.load_dataset("planets")

# Definición de las categorias de masa
mass_bins = [0, 2, 5, 10, 50]

# Uso de la función cut para segmentar los planetas por masa
mass = pd.cut(planets_data['mass'], mass_bins)

print(mass)
0        (5.0, 10.0]
1         (2.0, 5.0]
2         (2.0, 5.0]
3       (10.0, 50.0]
4       (10.0, 50.0]
            ...     
1030             NaN
1031             NaN
1032             NaN
1033             NaN
1034             NaN
Name: mass, Length: 1035, dtype: category
Categories (4, interval[int64, right]): [(0, 2] < (2, 5] < (5, 10] < (10, 50]]

En donde en primer lugar se importan las librerías y se carga el conjunto de datos. Posteriormente se define mediante una lista los rangos de categorías para la masa, se llama a la función cut() para segmentar los datos y, finalmente, se muestra el resultado. En dónde se puede ver una serie en la que a cada uno de los registros se le asigna un rango ((0, 2], (2, 5], (5, 10], (10, 50]) o NaN cuando los valores no caen dentro los rangos definidos o son son nulos.

Por defecto los rangos incluyen los valores por la derecha y no por la izquierda. Esto es, el rango (2, 5] incluye los planetas con masa mayor de 2, pero no 2, hasta 5 incluido. Un comportamiento que se puede cambiar asignado el valor falso a la propiedad right para que se incluyan los valores por la izquierda.

Ahora se puede usar la función value_counts() de Pandas para contabilizar el número de registros en cada uno de los segmentos.

pd.value_counts(mass)
(0, 2]      333
(2, 5]       95
(5, 10]      55
(10, 50]     30
Name: mass, dtype: int64

Personalización de las etiquetas

Usar directamente los valores de los rangos puede ser algo poco intuitivo, por lo que se le pueden asignar etiquetas personalizadas cuando se realiza la segmentación. Para lo que la función cut() dispone de la propiedad labels. Por ejemplo, los grupos de planetas se puede vivir en tierras, supertierras, minineptunos y neptunianos. Lo que se muestra en el siguiente ejemplo.

# Usar la función cut con etiquetas personalizadas
mass = pd.cut(planets_data['mass'], mass_bins,
              labels=['Tierras', 'Supertierras', 'Minineptunos', 'Neptunianos'])

print(mass)
print()
print(pd.value_counts(mass))
0       Minineptunos
1       Supertierras
2       Supertierras
3        Neptunianos
4        Neptunianos
            ...     
1030             NaN
1031             NaN
1032             NaN
1033             NaN
1034             NaN
Name: mass, Length: 1035, dtype: category
Categories (4, object): ['Tierras' < 'Supertierras' < 'Minineptunos' < 'Neptunianos']

Tierras         333
Supertierras     95
Minineptunos     55
Neptunianos      30
Name: mass, dtype: int64

Ahora el resultado es más intuitivo, pero no se cuentan los planetas con masa desconocida. Para ello se puede asignar una categoría nueva y reemplazar los valores nulos por esta. Algo que se puede conseguir con el siguiente código.

mass = mass.cat.add_categories('Desconocido').fillna('Desconocido')

print(mass)
print()
print(pd.value_counts(mass))
0       Minineptunos
1       Supertierras
2       Supertierras
3        Neptunianos
4        Neptunianos
            ...     
1030     Desconocido
1031     Desconocido
1032     Desconocido
1033     Desconocido
1034     Desconocido
Name: mass, Length: 1035, dtype: category
Categories (5, object): ['Tierras' < 'Supertierras' < 'Minineptunos' < 'Neptunianos' < 'Desconocido']

Desconocido     522
Tierras         333
Supertierras     95
Minineptunos     55
Neptunianos      30
Name: mass, dtype: int64

Haciendo aún más sencilla la interpretación de los datos. Poniendo de manifiesto que la mayoría de los registros de este conjunto de datos no se conoce la masa de los planetas.

Es importante definir la categoría antes de reemplazar los valores nulos por ésta, en caso contrario se producirá un error porque la categoría no existe en la lista de posibles opciones. Por eso en el ejemplo se ha agregado la categoría mediante el método add_categories().

Conclusiones

La función cut() es una herramienta con la que se puede segmentar datos numéricos en Pandas de una manera rápida y sencilla. Permitiendo análisis y visualizaciones de datos más intuitivos. Así, el uso de esta función ayuda a obtener una mejor comprensión de los conjuntos de datos durante el trabajo diario.

Image by NoName_13 from Pixabay

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Pandas

Recent Posts

Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…

3 días ago

Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)

En la serie Creación de una API REST con Express y TypeScript construimos una API…

5 días ago

Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte

Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…

1 semana ago

Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows

En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…

2 semanas ago

La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento

Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…

2 semanas ago

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…

3 semanas ago

This website uses cookies.