基于单行中的频率将分类变量转换为数字

goe*_*ash 6 python numpy pandas scikit-learn

这类似于scikit-learn 中的LabelEncoder,但要求数值分配按类别的频率顺序发生,即较高的出现类别被分配最高/最低(取决于用例)编号。

例如,如果变量可以[a, b, c]采用频率值,例如

  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 
Run Code Online (Sandbox Code Playgroud)

a出现5次,b出现10次,c出现2次。然后我希望替换完成为b=1,a=2c=3

goe*_*ash 1

正如 @Vivek Kumar 所建议的,我使用了地图功能,使用排序列值的字典作为键,使用它们的位置作为值:

data.Category = data.Category.map(dict(zip(data.Category.value_counts().index, range(1, len(data.Category.value_counts().index)+1))))
Run Code Online (Sandbox Code Playgroud)

看起来有点脏,最好将其分成几行,如下所示:

sorted_indices = data.Category.value_counts().index
data.Category = data.Category.map(dict(zip(sorted_indices, range(1, len(sorted_indices)+1))))
Run Code Online (Sandbox Code Playgroud)

这是最接近我的要求的。输出如下所示:

    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
Run Code Online (Sandbox Code Playgroud)