¿Cómo especificar una variable en pandas como ordinal / categórica?

Estoy tratando de ejecutar algo de aprendizaje automático en un conjunto de datos utilizando scikit-learn. Mi conjunto de datos tiene algunas características que son como categorías. Al igual que una característica es A, que tiene valores 1,2,3 que especifican la calidad de algo. 1:Upper, 2: Second, 3: Third class . Así que es como una variable ordinal.

De manera similar, he vuelto a codificar una ciudad de la variable, con tres valores ('London', Zurich', 'New York' en 1,2,3 pero sin preferencia específica por los valores. Ahora esta es una variable categórica nominal.

¿Cómo especifico el algoritmo para considerarlos como categóricos y ordinales, etc. en pandas? Al igual que en R, una variable categórica se especifica mediante el factor (a) y, por lo tanto, no se considera un valor continuo. ¿Hay algo así en pandas / python?

¿Cuál es la mejor manera de abordar esto?

Gracias

… años más tarde (y porque creo que se necesita una buena explicación de estos problemas no solo para esta pregunta sino para ayudarme a recordarme en el futuro)

Ordinal vs Nominal

En general, uno traduciría las variables categóricas en variables ficticias (o una gran cantidad de otras metodologías ), porque eran nominales, por ejemplo, no tenían sentido de a > b > c . En la pregunta original de los OP, esto solo se haría en las ciudades, como Londres, Zurich, Nueva York.

Variables ficticias para nominal

Para este tipo de problema, pandas proporciona, de lejos, la transformación más fácil usando pandas.get_dummies . Asi que:

 # create a sample of OPs unique values series = pandas.Series( numpy.random.randint(low=0, high=3, size=100)) mapper = {0: 'New York', 1: 'London', 2: 'Zurich'} nomvar = series.replace(mapper) # now let's use pandas.get_dummies print( pandas.get_dummies(series.replace(mpr)) Out[57]: London New York Zurich 0 0 0 1 1 0 1 0 2 0 1 0 3 1 0 0 

Codificación ordinal para variables categóricas

Sin embargo, en el caso de las variables ordinales, el usuario debe tener cuidado al usar pandas.factorize . La razón es que el ingeniero desea preservar la relación en el mapeo de manera que a > b > c .

Entonces, si quiero tomar un conjunto de variables categóricas donde large > medium > small , y preservar eso, necesito asegurarme de que pandas.factorize preserva esa relación.

 # leveraging the variables already created above mapper = {0: 'small', 1: 'medium', 2: 'large'} ordvar = series.replace(mapper) print(pandas.factorize(ordvar)) Out[58]: (array([0, 1, 1, 2, 1,... 0, 0]), Index(['large', 'small', 'medium'], dtype='object')) 

De hecho, la relación que debe preservarse para mantener el concepto de ordinal se ha perdido utilizando pandas.factorize . En una instancia como esta, utilizo mis propias asignaciones para garantizar que se conserven los atributos ordinales.

 preserved_mapper = {'large':2 , 'medium': 1, 'small': 0} ordvar.replace(preserved_mapper) print(ordvar.replace(preserved_mapper)) Out[78]: 0 2 1 0 ... 99 2 dtype: int64 

De hecho, al crear su propio dict para asignar los valores es una manera de no solo preservar su relación ordinal deseada, sino que también se puede usar como “mantener organizados los contenidos y asignaciones de su algoritmo de predicción” asegurando que no solo no haya perdido ninguno. Información ordinal en el proceso, pero también tienen registros almacenados de lo que es cada asignación para cada variable.

int está en sklearn

Por último, el OP habló sobre pasar la información a scikit-lean clasificadores scikit-lean , lo que significa que se requieren datos. En ese caso, asegúrese de estar al tanto del astype(int) gotcha que se detalla aquí si tiene algún NaN en sus datos.

Debe usar el transformador OneHotEncoder con las variables categóricas y dejar la variable ordinal sin tocar:

 >>> import pandas as pd >>> from sklearn.preprocessing import OneHotEncoder >>> df = pd.DataFrame({'quality': [1, 2, 3], 'city': [3, 2, 1], columns=['quality', 'city']} >>> enc = OneHotEncoder(categorical_features=[False, True]) >>> X = df.values >>> enc.fit(X) >>> enc.transform(X).todense() matrix([[ 0., 0., 1., 1.], [ 0., 1., 0., 2.], [ 1., 0., 0., 3.]]) 

Vea https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html y vea esta pregunta Cómo reformatear variables categóricas de Pandas para Sci-kit Aprenda