Supongamos que tengo un marco de datos con países que va como:
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 one-hot'. Sin embargo, deseo convertirlos en índices en su lugar, de modo que obtengo en su 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 where numpy 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.

cc_index = [0,1,0,2]?Respuestas:
Primero, cambie el tipo de columna:
Ahora los datos se ven similares pero se almacenan categóricamente. Para capturar los códigos de categoría:
df['code'] = df.cc.cat.codesAhora tu tienes:
cc temp code 0 US 37.0 2 1 CA 12.0 1 2 US 35.0 2 3 AU 20.0 0Si no desea modificar su DataFrame sino simplemente obtener los códigos:
df.cc.astype('category').cat.codesO use la columna categórica como índice:
fuente
df.cc.cat.codesparece haber cambiado a solodf.cc.codes?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 se asignará el primer país0. Si desea comenzar desde1, 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 3Si desea ordenar alfabéticamente, especifique
sort=True:df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1fuente
Si está utilizando la
sklearnbiblioteca, puede utilizarLabelEncoder. Por ejemplopd.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 0fuente
Pruebe esto, convierta a un número basado en la frecuencia (alta frecuencia - número alto):
labels = df[col].value_counts(ascending=True).index.tolist() codes = range(1,len(labels)+1) df[col].replace(labels,codes,inplace=True)fuente
Cambiará cualquier columna a Números. No creará una nueva columna, solo reemplazará los valores con datos numéricos.
def characters_to_numb(*args): for arg in args: df[arg] = pd.Categorical(df[arg]) df[arg] = df[arg].cat.codes return dffuente
Código de una línea:
df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)Esto también funciona si tiene
list_of_columns:df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)Además, si desea mantener sus
NaNvalores, puede aplicar un reemplazo:df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)fuente