
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.
Deja una respuesta