multiple get_dummies example dummy dummies columns python pandas

python - example - pandas get_dummies nan



Creando variables ficticias en pandas para python (9)

Así que en realidad necesitaba una respuesta a esta pregunta hoy (7/25/2013), así que escribí esto antes. Lo he probado con algunos ejemplos de juguetes, con suerte obtendrás algo de kilometraje

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

Estoy tratando de crear una serie de variables ficticias a partir de una variable categórica usando pandas en python. Me he encontrado con la función get_dummies , pero cada vez que intento llamarlo recibo un error que get_dummies que el nombre no está definido.

Cualquier pensamiento u otra forma de crear las variables ficticias sería apreciado.

EDITAR : Como parece que otros se están encontrando con esto, la función get_dummies en pandas ahora funciona perfectamente bien. Esto significa que lo siguiente debería funcionar:

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

Consulte http://blog.yhathq.com/posts/logistic-regression-and-python.html para obtener más información.


Basado en la documentación oficial :

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)

También hay una buena post en el blog de FastML.


Creé una variable ficticia para cada estado usando este código.

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()

Más generalmente, solo usaría .apply y le pasaría una función anónima con la desigualdad que define su categoría.

(Gracias a @ prpl.mnky.dshwshr por la perspectiva .unique ())


Cuando pienso en variables ficticias, pienso en usarlas en el contexto de la regresión OLS, y haría algo como esto:

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()


El manejo de características categóricas scikit-learn espera que todas las características sean numéricas. Entonces, ¿cómo incluimos una característica categórica en nuestro modelo?

Categorías ordenadas: transformarlas en valores numéricos razonables (ejemplo: pequeño = 1, medio = 2, grande = 3) Categorías desordenadas: usar codificación ficticia (0/1) ¿Cuáles son las características categóricas en nuestro conjunto de datos?

Categorías ordenadas: clima (ya codificado con valores numéricos razonables) Categorías desordenadas: temporada (necesita codificación ficticia), día festivo (ya codificado), día laborable (ya codificado) Para la temporada, no podemos simplemente dejar la codificación como 1 = primavera , 2 = verano, 3 = otoño y 4 = invierno, porque eso implicaría una relación ordenada. En su lugar, creamos múltiples variables ficticias:

# 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`



Es difícil inferir lo que está buscando de la pregunta, pero mi mejor estimación es la siguiente.

Si asumimos que tiene un DataFrame donde alguna columna es ''Categoría'' y contiene enteros (o identificadores únicos) para las categorías, entonces podemos hacer lo siguiente.

Llame al DataFrame dfrm y suponga que para cada fila, dfrm[''Category''] es un valor en el conjunto de enteros de 1 a N. Luego,

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

Ahora habrá una nueva columna de indicador para cada categoría que sea Verdadero / Falso, dependiendo de si los datos en esa fila están en esa categoría.

Si desea controlar los nombres de las categorías, puede crear un diccionario, como

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

para tener columnas con nombres específicos, en lugar de solo la conversión de cadena de los valores de categoría. De hecho, para algunos tipos, str() puede no producir nada útil para usted.


Para mi caso, las dmatrices en patsy solucionaron mi problema. En realidad, esta función está diseñada para la generación de variables dependientes e independientes a partir de un DataFrame dado con una cadena de fórmula de estilo R. Pero se puede usar para la generación de características ficticias a partir de las características categóricas. Todo lo que necesita hacer es eliminar la columna ''Interceptar'' que es generada por dmatrices automáticamente, independientemente de su DataFrame original.

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


Puede crear variables ficticias para manejar los datos categóricos

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

Esto eliminará las columnas originales en trainDf y agregará la columna con variables ficticias al final del marco de datos trainDfDummies.

Crea automáticamente los nombres de columna agregando los valores al final del nombre de columna original.