vender - python convert categorical variable to dummy
Pandas: convierte categorÃas a números (3)
Supongamos que tengo un marco de datos con países que dice:
cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0
Sé que hay una función pd.get_dummies para convertir los países a ''codificaciones de una sola vez''.
Sin embargo, deseo convertirlos a índices en su lugar de modo que obtenga
cc_index = [1,2,1,3]
lugar.
Supongo que hay una forma más rápida que usar get_dummies junto con una cláusula numpy where como se muestra a continuación:
[np.where(x) for x in df.cc.get_dummies().values]
Esto es algo más fácil de hacer en R usando ''factores'', así que espero que los pandas tengan algo similar.
Primero, cambie el tipo de columna:
df.cc = pd.Categorical(df.cc)
Ahora los datos se ven similares pero se almacenan categóricamente. Para capturar los códigos de categoría:
df[''code''] = df.cc.cat.codes
Ahora tu tienes:
cc temp code
0 US 37.0 2
1 CA 12.0 1
2 US 35.0 2
3 AU 20.0 0
Si no desea modificar su DataFrame, simplemente obtenga los códigos:
df.cc.astype(''category'').cat.codes
O use la columna categórica como índice:
df2 = pd.DataFrame(df.temp)
df2.index = pd.CategoricalIndex(df.cc)
Si está utilizando la biblioteca
sklearn
, puede usar
LabelEncoder
.
Al igual que
pd.Categorical
, las cadenas de entrada se ordenan alfabéticamente antes de la codificación.
from sklearn.preprocessing import LabelEncoder
LE = LabelEncoder()
df[''code''] = LE.fit_transform(df[''cc''])
print(df)
cc temp code
0 US 37.0 2
1 CA 12.0 1
2 US 35.0 2
3 AU 20.0 0
Si solo desea transformar su serie en identificadores enteros, puede usar
pd.factorize
.
Tenga en cuenta que esta solución, a diferencia de
pd.Categorical
, no se ordenará alfabéticamente.
Entonces, al primer país se le asignará
0
.
Si desea comenzar desde
1
, puede agregar una constante:
df[''code''] = pd.factorize(df[''cc''])[0] + 1
print(df)
cc temp code
0 US 37.0 1
1 CA 12.0 2
2 US 35.0 1
3 AU 20.0 3
Si desea ordenar alfabéticamente, especifique
sort=True
:
df[''code''] = pd.factorize(df[''cc''], sort=True)[0] + 1