Python

Acotar los valores en un DataFrame de Pandas

Existen diferentes motivos por los que puede ser necesario limitar o acotar los valores en un DataFrame. Por ejemplo, eliminar valores atípicos o garantizar la consistencia de los datos. Esto es algo que se puede conseguir mediante asignaciones condicionales de valores, aunque también existe el método clip() que lo permite hacer de una manera más legible y con la que es más fácil comprender el código.

Fijar el valor mínimo en un DataFrame de Pandas mediante asignación condicional

Para ver cómo acotar los valores en un DataFrame se puede crear uno con un conjunto de datos aleatorio. Por ejemplo, el que se obtiene con el siguiente código.

import pandas as pd
import numpy as np

np.random.seed(0)

data = pd.DataFrame(np.random.randint(0, 100, (5, 4)),
                    columns=['A', 'B', 'C', 'D'])

data
    A   B   C   D
0  44  47  64  67
1  67   9  83  21
2  36  87  70  88
3  88  12  58  65
4  39  87  46  88

El resultado es un DataFrame con cuatro columnas y cinco filas de valores aleatorios entre 0 y 100. En este caso, hay dos registros cuyo valor es inferior a 20: B1 y B3. Si se necesita que el valor mínimo en este conjunto de datos sea igual a 20, se pueden modificar estos registros mediante asignación condicional.

data[data < 20] = 20
data
    A   B   C   D
0  44  47  64  67
1  67  20  83  21
2  36  87  70  88
3  88  20  58  65
4  39  87  46  88

Lo que reemplaza por el valor deseado todos los registros que cumple la condición. Si se desea acotar también los valores que superan uno dado, simplemente se tiene que repetir la línea anterior con nueva condición. Por ejemplo, fijar un máximo de 80 para los valores.

data[data > 80] = 80
data
    A   B   C   D
0  44  47  64  67
1  67  20  80  21
2  36  80  70  80
3  80  20  58  65
4  39  80  46  80

Uso del método clip() para acotar los valores en un DataFrame

Aunque la asignación condicional funciona bien, el uso del método clip() puede ser más fácil de entender para usuarios con poca experiencia en Pandas. Al presentar una sintaxis es más fácil de leer. Para reemplazar todos los valores que sean inferiores a un mínimo por este solamente se tiene que llamar indicando el valor en el parámetro lower. Lo que se muestra a continuación, donde primero se vuelven a regenerar el DataFrame aleatorio.

np.random.seed(0)

data = pd.DataFrame(np.random.randint(0, 100, (5, 4)),
                    columns=['A', 'B', 'C', 'D'])

data.clip(lower=20)
    A   B   C   D
0  44  47  64  67
1  67  20  83  21
2  36  87  70  88
3  88  20  58  65
4  39  87  46  88

Para definir un valor máximo solamente se tiene que indicar este mediante el parámetro upper. Así, para indicar un máximo de 80 solamente se tiene que ejecutar la siguiente línea.

data.clip(upper=80)
    A   B   C   D
0  44  47  64  67
1  67   9  80  21
2  36  80  70  80
3  80  12  58  65
4  39  80  46  80

Obviamente, si se combinan los dos parámetros en una llamada, se puede acotar al mismo tiempo los valores máximos y mínimos.

data.clip(lower=20, upper=80)
    A   B   C   D
0  44  47  64  67
1  67  20  80  21
2  36  80  70  80
3  80  20  58  65
4  39  80  46  80

Nótese que el método, como la mayoría de los métodos de los DataFrames de Pandas, devuelve una copia de los datos originales con los cambios. Algo que puede generar problemas de memoria cuando se trabaja con conjuntos de datos grandes. Si se desea evitar esto y modificar el objeto original se puede asignar el valor verdadero a la propiedad inplace.

data.clip(lower=20, upper=80, inplace=True)
data
    A   B   C   D
0  44  47  64  67
1  67  20  80  21
2  36  80  70  80
3  80  20  58  65
4  39  80  46  80

Conclusiones

En esta entrada se han visto dos alternativas para acotar los valores en un DataFrame de Pandas: asignación condicional y el método clip(). Aunque la asignación condicional es una forma sencilla de obtener los resultados, el método clip() ofrece una opción que puede ser más fácil de leer. Con lo que se puede conseguir un código más limpio y fácil de mantener.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Pandas

Recent Posts

Errores habituales al trabajar con DataFrames grandes en Pandas (y cómo evitarlos)

Hay un momento muy concreto en la vida de casi todo análisis: el código que…

1 día ago

Champion vs Challenger: Cómo los Bancos Validan Modelos Nuevos antes de Ponerlos en Producción

Has construido un nuevo modelo de credit scoring. Las métricas de validación son mejores que…

3 días ago

Cómo Comparar Dos Hipotecas con Todos los Gastos Incluidos

Comparar dos hipotecas parece sencillo: la que tenga el TIN más bajo es la mejor…

1 semana ago

Segmentación RFM: cómo clasificar tu cartera de clientes antes de calcular el CLV

En un artículo anterior vimos la fórmula clásica del CLV junto a sus limitaciones. Una…

1 semana ago

Los récords con asterisco, o la épica del titular sin contexto – El bestiario de los indicadores económicos absurdos (parte 8 y final)

Y llegamos al final de una serie que había programado para ser de tres entradas.…

2 semanas ago

PSI: Cómo Saber Cuándo tu Modelo de Credit Scoring se ha Degradado

Un modelo de credit scoring no es un artefacto estático. Se construye en un momento…

2 semanas ago

This website uses cookies.