Création de variables fictives dans pandas pour python

j'essaie de créer une série de variables fictives à partir d'une variable catégorique en utilisant pandas en python. Je suis tombé sur la fonction get_dummies , mais chaque fois que j'essaie de l'appeler, je reçois une erreur que le nom n'est pas défini.

toutes les idées ou autres façons de créer les variables fictives seraient appréciées.

EDIT : puisque d'autres semblent tomber dessus, la fonction get_dummies dans pandas fonctionne maintenant parfaitement bien. Cela signifie que les éléments suivants devraient fonctionner:

import pandas as pd

dummies = pd.get_dummies(df['Category'])

voir http://blog.yhathq.com/posts/logistic-regression-and-python.html pour plus d'informations.

22
demandé sur piRSquared 2012-07-21 02:33:29

9 réponses

il est difficile de déduire ce que vous cherchez à partir de la question, mais ma meilleure supposition est la suivante.

si nous supposons que vous avez une base de données où une colonne est "Catégorie" et contient des entiers (ou autres identificateurs uniques) pour les catégories, alors nous pouvons faire ce qui suit.

appeler le DataFrame dfrm , et supposer que pour chaque ligne, dfrm['Category'] est une certaine valeur dans l'ensemble des entiers de 1 à N. alors,

for elem in dfrm['Category'].unique():
    dfrm[str(elem)] = dfrm['Category'] == elem

maintenant, il y aura une nouvelle colonne indicatrice pour chaque catégorie qui est vrai/faux selon que les données dans cette rangée sont dans cette catégorie.

si vous voulez contrôler les noms des catégories, vous pouvez faire un dictionnaire, comme

cat_names = {1:'Some_Treatment', 2:'Full_Treatment', 3:'Control'}
for elem in dfrm['Category'].unique():
    dfrm[cat_names[elem]] = dfrm['Category'] == elem

pour avoir comme résultat des colonnes avec des noms spécifiés, plutôt que la simple conversion de chaîne des valeurs de catégorie. En fait, pour certains types, str() peut ne pas produire quelque chose d'utile pour vous.

14
répondu ely 2012-07-21 02:29:57

quand je pense à des variables fictives, je pense à les utiliser dans le contexte de la régression OLS, et je ferais quelque chose comme ça:

import numpy as np
import pandas as pd
import statsmodels.api as sm

my_data = np.array([[5, 'a', 1],
                    [3, 'b', 3],
                    [1, 'b', 2],
                    [3, 'a', 1],
                    [4, 'b', 2],
                    [7, 'c', 1],
                    [7, 'c', 1]])                


df = pd.DataFrame(data=my_data, columns=['y', 'dummy', 'x'])
just_dummies = pd.get_dummies(df['dummy'])

step_1 = pd.concat([df, just_dummies], axis=1)      
step_1.drop(['dummy', 'c'], inplace=True, axis=1)
# to run the regression we want to get rid of the strings 'a', 'b', 'c' (obviously)
# and we want to get rid of one dummy variable to avoid the dummy variable trap
# arbitrarily chose "c", coefficients on "a" an "b" would show effect of "a" and "b"
# relative to "c"
step_1 = step_1.applymap(np.int) 

result = sm.OLS(step_1['y'], sm.add_constant(step_1[['x', 'a', 'b']])).fit()
print result.summary()
28
répondu Akavall 2015-09-30 14:49:03

basé sur la documentation officielle :

dummies = pd.get_dummies(df['Category']).rename(columns=lambda x: 'Category_' + str(x))
df = pd.concat([df, dummies], axis=1)
df = df.drop(['Category'], inplace=True, axis=1)

il y a aussi un beau post dans le blog FastML.

12
répondu beyondfloatingpoint 2015-12-24 21:07:15

le code suivant renvoie le datagramme avec la colonne "Catégorie" remplacée par les colonnes "catégories":

df_with_dummies = pd.get_dummies(df, prefix='Category_', columns=['Category'])

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html

3
répondu Spas 2018-07-10 09:06:44

pour mon affaire, dmatrices dans patsy a résolu mon problème. En fait, cette fonction est conçue pour la génération de variables dépendantes et indépendantes à partir d'une DataFrame donnée avec une chaîne de Formule R-style. Mais il peut être utilisé pour la génération de mannequin caractéristiques de l'catégorique fonctionnalités. Tout ce que vous devez faire serait de laisser tomber la colonne 'Intercept' qui est générée par dmatrices automatiquement indépendamment de votre DataFrame d'origine.

import pandas as pd
from patsy import dmatrices

df_original = pd.DataFrame({
   'A': ['red', 'green', 'red', 'green'],
   'B': ['car', 'car', 'truck', 'truck'],
   'C': [10,11,12,13],
   'D': ['alice', 'bob', 'charlie', 'alice']},
   index=[0, 1, 2, 3])

_, df_dummyfied = dmatrices('A ~ A + B + C + D', data=df_original, return_type='dataframe')
df_dummyfied = df_dummyfied.drop('Intercept', axis=1)

df_dummyfied.columns    
Index([u'A[T.red]', u'B[T.truck]', u'D[T.bob]', u'D[T.charlie]', u'C'], dtype='object')

df_dummyfied
   A[T.red]  B[T.truck]  D[T.bob]  D[T.charlie]     C
0       1.0         0.0       0.0           0.0  10.0
1       0.0         0.0       1.0           0.0  11.0
2       1.0         1.0       0.0           1.0  12.0
3       0.0         1.0       0.0           0.0  13.0
1
répondu Erdem KAYA 2016-09-23 18:06:15

vous pouvez créer des variables fictives pour gérer les données catégoriques

# Creating dummy variables for categorical datatypes
trainDfDummies = pd.get_dummies(trainDf, columns=['Col1', 'Col2', 'Col3', 'Col4'])

cela fera tomber les colonnes originales dans trainDf et ajoutera la colonne avec des variables muettes à la fin du trainDfDummies dataframe.

il crée automatiquement les noms de colonne en ajoutant les valeurs à la fin du nom de colonne original.

1
répondu rzskhr 2017-05-21 23:28:03

j'étais Donc avoir une réponse à cette question aujourd'hui (7/25/2013), donc j'ai écrit plus tôt. Je l'ai testé avec des jouets exemples, nous espérons que vous obtenez certains kilométrage

def categorize_dict(x, y=0):
    # x Requires string or numerical input
    # y is a boolean that specifices whether to return category names along with the dict.
    # default is no
    cats = list(set(x))
    n = len(cats)
    m = len(x)
    outs = {}
    for i in cats:
        outs[i] = [0]*m
    for i in range(len(x)):
        outs[x[i]][i] = 1
    if y:
        return outs,cats
    return outs
0
répondu ThomasRoderick 2013-07-25 20:02:41

j'ai créé une variable fictive pour chaque État en utilisant ce code.

def create_dummy_column(series, f):
    return series.apply(f)

for el in df.area_title.unique():
    col_name = el.split()[0] + "_dummy"
    f = lambda x: int(x==el)
    df[col_name] = create_dummy_column(df.area_title, f)
df.head()

Plus généralement, je voudrais juste utiliser .d'appliquer et de transmettre une fonction anonyme à l'inégalité qui définit votre catégorie.

(merci à @prpl.mnky.dshwshr pour la .unique () insight)

0
répondu userFog 2014-12-20 05:51:26

manutention caractéristiques des catégories scikit-learn s'attend à ce que toutes les fonctionnalités soient numériques. Alors, comment inclure une caractéristique catégorique dans notre modèle?

catégories ordonnées: les transformer en valeurs numériques sensibles (exemple: Petite=1, Moyenne=2, Grande=3)) Catégories non ordonnées: utiliser un codage fictif (0/1) Quelles sont les caractéristiques catégoriques de notre ensemble de données?

catégories ordonnées: météo (déjà encodé avec des valeurs numériques sensibles) Catégories non classées: saison (besoins factices encodage), vacances (déjà mannequin codés), workingday (déjà mannequin codé) Pour la saison, nous ne pouvons pas simplement laisser l'encodage comme 1 = printemps, 2 = été, 3 = automne, et 4 = hiver, parce que cela impliquerait une relation ordonnée. Au lieu de cela, nous créons plusieurs variables fictives:

# An utility function to create dummy variable
`def create_dummies( df, colname ):
col_dummies = pd.get_dummies(df[colname], prefix=colname)
col_dummies.drop(col_dummies.columns[0], axis=1, inplace=True)
df = pd.concat([df, col_dummies], axis=1)
df.drop( colname, axis = 1, inplace = True )
return df`
0
répondu subodh agrawal 2018-04-05 07:38:17