当前位置: 代码迷 >> python >> 根据单行频率将分类变量转换为数字
  详细解决方案

根据单行频率将分类变量转换为数字

热度:71   发布时间:2023-06-19 09:18:21.0

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

例如,如果变量可以采用频率为[a, b, c][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 

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

见 :

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

回报

  Category  Frequency  Order
0        a          5      3
1        b         10      1
2        c          2      2

如果您使用的是熊猫,则可以使用其 :

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使用列中存在 ,该列以字母排序顺序返回值,因此您不能在其中使用自定义顺序。

正如@Vivek Kumar所建议的那样,我使用了地图功能,将已排序的列值的字典作为键,并将其位置作为值:

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

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

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

这是我最接近要求的位置。 输出看起来像这样:

    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
  相关解决方案