Esto es similar a LabelEncoder de scikit-learn, pero con el requisito de que las asignaciones de valor numérico ocurran en orden de frecuencia de la categoría, es decir, a la categoría más alta se le asigna el número más alto / más bajo (dependiendo del caso de uso).

P.ej. Si la variable puede tomar valores [a, b, c] con frecuencias como

  Category 
0        a 
0        a 
0        a 
0        a 
0        a 
1        b 
1        b 
1        b 
1        b 
1        b 
1        b 
1        b 
1        b 
1        b 
1        b 
2        c 
2        c 

a ocurre 5 veces, b ocurre 10 veces y c ocurre 2 veces. Entonces quiero que los reemplazos se realicen como b=1, a=2 y c=3.

4
goelakash 16 sep. 2018 a las 20:16

3 respuestas

La mejor respuesta

Según lo sugerido por @Vivek Kumar, utilicé la funcionalidad del mapa, usando un dict de los valores de columna ordenados como clave y su posición como valor:

data.Category = data.Category.map(dict(zip(data.Category.value_counts().index, range(1, len(data.Category.value_counts().index)+1))))

Parece un poco sucio, sería mucho mejor dividirlo en un par de líneas como esta:

sorted_indices = data.Category.value_counts().index
data.Category = data.Category.map(dict(zip(sorted_indices, range(1, len(sorted_indices)+1))))

Esto es lo más cercano que tengo a mi requerimiento. El resultado se ve así:

    Category
0          2
1          2
2          2
3          2
4          2
5          1
6          1
7          1
8          1
9          1
10         1
11         1
12         1
13         1
14         1
15         3
16         3
0
goelakash 17 sep. 2018 a las 14:58

Si está usando pandas, puede usar su {{ X0}} método:

import pandas as pd
data = pd.DataFrame([['a'], ['b'], ['c']], columns=['category'])

print(data)

  category
0        a
1        b
2        c

mapping_dict = {'b':1, 'a':2, 'c':3}

print(data['category'].map(mapping_dict))

0    2
1    1
2    3

LabelEncoder utiliza np.unique para encontrar el valores únicos presentes en una columna que devuelve valores en orden alfabético, por lo que no puede utilizar el orden personalizado en ella.

1
Vivek Kumar 17 sep. 2018 a las 09:26

Consulte argsort:

df['Order'] = df['Frequency'].argsort() + 1
df

Devuelve

  Category  Frequency  Order
0        a          5      3
1        b         10      1
2        c          2      2
2
Alex 16 sep. 2018 a las 17:28