2017-04-27 2 views
3

Je gère un sous-ensemble d'un grand ensemble de données.Créer des variables d'une colonne pour un sous-ensemble de données, qui ne contient pas toutes les valeurs de catégorie dans cette colonne

Il existe une colonne nommée "type" dans la structure de données. Le "type" devrait avoir des valeurs comme [1,2,3,4].

Dans un sous-ensemble, je trouve le « type » colonne ne contient que certaines valeurs comme [1,4], comme

In [1]: df 
Out[2]: 
      type 
    0  1 
    1  4 

Lorsque je crée des mannequins de la colonne « type » sur ce sous-ensemble, il se comme ceci:

In [3]:import pandas as pd 
In [4]:pd.get_dummies(df["type"], prefix = "type") 
Out[5]:  type_1 type_4 
     0  1  0 
     1  0  1 

Il does't ont les colonnes nommées "type_2", "type_3" .Quel que je veux est comme:

Out[6]:  type_1 type_2 type_3 type_4 
      0  1  0  0  0 
      1  0  0  0  1 

Y a-t-il une solution pour cela?

Répondre

1

Une autre solution avec reindex_axis et add_prefix:

df1 = pd.get_dummies(df["type"]) 
     .reindex_axis([1,2,3,4], axis=1, fill_value=0) 
     .add_prefix('type') 
print (df1) 
    type1 type2 type3 type4 
0  1  0  0  0 
1  0  0  0  1 

Ou categorical solution:

df1 = pd.get_dummies(df["type"].astype('category', categories=[1, 2, 3, 4]), prefix='type') 
print (df1) 
    type_1 type_2 type_3 type_4 
0  1  0  0  0 
1  0  0  0  1 
+0

Glad peut vous aider. Belle journée! – jezrael

2

Ce que vous devez faire est de la colonne 'type' dans un pd.Categorical et préciser le categories

pd.get_dummies(pd.Categorical(df.type, [1, 2, 3, 4]), prefix='type') 

    type_1 type_2 type_3 type_4 
0  1  0  0  0 
1  0  0  0  1 
2

Depuis vous avez marqué votre poste one-hot-encoding, vous trouverez peut-être OneHotEncoder utile, en plus des solutions pures Pandas de modules sklearn:

import pandas as pd 
from sklearn.preprocessing import OneHotEncoder 

# sample data 
df = pd.DataFrame({'type':[1,4]}) 
n_vals = 5 

# one-hot encoding 
encoder = OneHotEncoder(n_values=n_vals, sparse=False, dtype=int) 
data = encoder.fit_transform(df.type.values.reshape(-1,1)) 

# encoded data frame 
newdf = pd.DataFrame(data, columns=['type_{}'.format(x) for x in range(n_vals)]) 

print(newdf) 

    type_0 type_1 type_2 type_3 type_4 
0  0  1  0  0  0 
1  0  0  0  0  1 

Un avantage d'utiliser cette approche est que OneHotEncoder produit facilement des vecteurs rares, pour très grande classe ensembles. (Il suffit de passer à sparse=True dans la déclaration OneHotEncoder().)