Imputación de un valor constante

Otra opción es sustituir los valores nulos por un valor, como la media, la mediana o la moda (el valor más frecuente) de la característica predictiva a la que pertenezca el valor nulo. Salvo la moda (que es aplicable a todo tipo de características), este enfoque solo es aplicable cuando la característica es numérica.

Con este objetivo podemos utilizar la clase sklearn.impute.SimpleImputer de Scikit-Learn, o el método .fillna() de las estructuras Pandas.

Por ejemplo, supongamos que deseamos sustituir los valores nulos de la característica age de titanic.

Usando el método .fillna() podríamos sustituirlos por el valor medio de las edades de la siguiente forma:

t = titanic.age.fillna(titanic.age.mean())

En el código anterior se ha volcado el resultado en la variable t, pero podríamos haber sobrescrito la columna titanic.age. De hecho, también podríamos haber asignado al parámetro inplace de la función fillna el valor True, para que la sustitución se ejecutase directamente sobre la columna en cuestión. 

Usando la clase SimpleImputer sería necesario importarla e instanciarla:

from sklearn.impute import SimpleImputer
imputer = SimpleImputer()

El parámetro strategy de SimpleImputer puede tomar los valores "mean", "median", "most_frequent" o "constant", y representa el enfoque a seguir en la sustitución los nulos (el valor por defecto es "mean"). Si se especifica el valor "constant" (lo que sustituye los nulos por un valor concreto), habrá que indicar el valor en cuestión asignándolo al parámetro fill_value.

A continuación, deberemos entrenar la instancia y aplicar la transformación a los datos. Esto puede hacerse por separado o de una vez usando el método .fit_transform():

t = imputer.fit_transform(titanic[["age"]])

El resultado es un array NumPy con el que podríamos sobrescribir la columna original.

Si, por ejemplo, quisiéramos sustituir los nulos por el valor máximo de la columna usando la clase SimpleImputer, el código podría ser el siguiente:

imputer = SimpleImputer(
    strategy = "constant",
    fill_value = titanic.age.max()
)
t = imputer.fit_transform(titanic[["age"]])