J'encode mes dataframes (entraînement et test) avec onehot en utilisant pd.get_dummies(). Cependant, les deux dataframes sont plutôt volumineux et j'ai remarqué qu'il génère des tailles de colonnes différentes. 271 vs 290. Cela est dû au fait que certaines variables qualitatives ont des valeurs dans une base de données par rapport à pas dans l'autre.

Existe-t-il une commande que je peux utiliser avec pd.get_dummies pour m'assurer que j'obtiens une colonne vide avec des 0 lorsque ces variables sont présentes dans l'autre dataframe?

1
Zachary Wyman 30 août 2020 à 03:28

2 réponses

Meilleure réponse

Lorsque vous avez le dataframe et que vous souhaitez transformer l'objet en variable factice, ne le divisez pas avant d'utiliser get_dummies

 df = pd.get_dummies(df)
 train = df[cond]
 test = df.drop(train.index)

Pour corriger votre code

df = pd.get_dummies(pd.concat([train , test]))
train = df[df.index.isin(train.index)]
test = df.drop(train.index)
2
BENY 30 août 2020 à 00:34

Votre pari le plus sûr, lorsque cela est possible, est de convertir votre colonne en un type de données catégoriel qui inclut toutes les valeurs possibles avant d'utiliser get_dummies. Ceci est particulièrement utile si vos données d'entraînement changent fréquemment (streaming / fréquemment mis à jour) et que vous souhaitez une compatibilité maximale:

x_values = ["a", "b", "c", "d", "e"]
x_type = pd.Categorical(values=x_values)
df = pd.DataFrame(dict(x=["a", "b", "c"], y=[1,2,3]))

Les mannequins qui ne connaissent pas les valeurs possibles "d", "e":

x_dummies = pd.get_dummies(df.x)

   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1    

Les mannequins qui connaissent "d", "e" existent, même s'ils ne sont pas représentés dans les données présentes:

df["x"] = df["x"].astype(x_cat)
x_dummies = pd.get_dummies(df.x)

   a  b  c  d  e
0  1  0  0  0  0
1  0  1  0  0  0
2  0  0  1  0  0
0
anon01 30 août 2020 à 02:00