这类似于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=1
,a=2
和c=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