La clase OneHotEncoder

Apliquemos, en primer lugar, la clase OneHotEncoder de Scikit-Learn a la característica "embarked" del dataset Titanic. Confirmemos, en primer lugar, los valores únicos de esta columna:

titanic.embarked.unique()
array(['S', 'C', 'Q', nan], dtype=object)

Contiene los textos "S", "C" y "Q" y valores nulos.

Ahora importemos la clase OneHotEncoder e instanciémosla:

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()

Podemos entrenar el codificador a partir de una característica y aplicarlo a la misma característica con el método .fit_transform():

data = encoder.fit_transform(titanic.embarked.values.reshape(-1, 1))
data
<891x4 sparse matrix of type '<class 'numpy.float64'>'
    with 891 stored elements in Compressed Sparse Row format>

Obsérvese que, para su entrenamiento, el método .fit_transform() requiere que pasemos una estructura bidimensional, y que el resultado es una matriz dispersa.

Podemos convertirla en una matriz densa con el método .toarray():

data = encoder.fit_transform(titanic.embarked.values.reshape(-1, 1)).toarray()
data
array([[0., 0., 1., 0.],
       [1., 0., 0., 0.],
       [0., 0., 1., 0.],
       ...,
       [0., 0., 1., 0.],
       [1., 0., 0., 0.],
       [0., 1., 0., 0.]])

Esta estructura es el equivalente a la columna "embarked".

Una vez entrenado el codificador podemos acceder a las categorías identificadas con el atributo .categories_:

encoder.categories_
[array(['C', 'Q', 'S', nan], dtype=object)]

Ahora, podríamos sustituir la columna original por estos datos, por ejemplo, de la siguiente manera:

titanic = pd.concat([
    titanic.drop("embarked", axis = 1),
    pd.DataFrame(data, columns = encoder.categories_[0])
], axis = 1)

Si visualizamos el DataFrame:

titanic.head()
La clase OneHotEncoder

vemos las cuatro columnas añadidas al final de la estructura, incluyéndose, para cada fila, un 1 en la columna que representa la ciudad en la que embarcó el pasajero correspondiente (o un 1 en la última columna si el valor en cuestión era un nulo).