J'ai le code suivant pour coder à chaud 2 colonnes que j'ai.

# encode city labels using one-hot encoding scheme
city_ohe = OneHotEncoder(categories='auto')
city_feature_arr = city_ohe.fit_transform(df[['city']]).toarray()
city_feature_labels = city_ohe.categories_
city_features = pd.DataFrame(city_feature_arr, columns=city_feature_labels)

phone_ohe = OneHotEncoder(categories='auto')
phone_feature_arr = phone_ohe.fit_transform(df[['phone']]).toarray()
phone_feature_labels = phone_ohe.categories_
phone_features = pd.DataFrame(phone_feature_arr, columns=phone_feature_labels)

Ce que je me demande, c'est comment je fais cela en 4 lignes tout en obtenant des colonnes correctement nommées dans la sortie. Autrement dit, je peux créer un tableau correctement codé à chaud en incluant les deux noms de colonnes dans fit_transform mais lorsque j'essaie de nommer les colonnes de la trame de données résultante, cela m'indique qu'il y a un décalage entre la forme des indices :

ValueError: Shape of passed values is (6, 50000), indices imply (3, 50000)

Pour le fond, le téléphone et la ville ont 3 valeurs.

    city    phone
0   CityA   iPhone
1   CityB Android
2   CityB iPhone
3   CityA   iPhone
4   CityC   Android
2
Gideon Blinick 18 mars 2019 à 23:09

2 réponses

Meilleure réponse

Vous vous y êtes presque ... Comme vous l'avez dit, vous pouvez ajouter directement toutes les colonnes que vous souhaitez encoder dans fit_transform.

ohe = OneHotEncoder(categories='auto')
feature_arr = ohe.fit_transform(df[['phone','city']]).toarray()
feature_labels = ohe.categories_

Et puis il vous suffit de faire ce qui suit:

feature_labels = np.array(feature_labels).ravel()

Ce qui vous permet de nommer vos colonnes comme vous le vouliez:

features = pd.DataFrame(feature_arr, columns=feature_labels)
8
MaximeKan 19 mars 2019 à 01:03

Pourquoi ne pas jeter un œil à pd.get_dummies  ? Voici comment vous pouvez encoder :

df['city'] = df['city'].astype('category')
df['phone'] = df['phone'].astype('category')
df = pd.get_dummies(df)
1
panktijk 18 mars 2019 à 23:11