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

时间:2018-09-16 17:16:45

标签: python pandas numpy scikit-learn

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

例如如果变量可以采用频率为{p>的值[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

3 个答案:

答案 0 :(得分:2)

请参见argsort

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

返回

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

答案 1 :(得分:1)

如果您使用的是熊猫,则可以使用其map() method

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使用一列中的np.unique to find the unique values来返回按字母顺序排序的值,因此您不能在其中使用自定义顺序。

答案 2 :(得分:0)

如@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