问题描述
这类似于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=1
, a=2
和c=3
。
1楼
见 :
df['Order'] = df['Frequency'].argsort() + 1
df
回报
Category Frequency Order
0 a 5 3
1 b 10 1
2 c 2 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使用列中存在 ,该列以字母排序顺序返回值,因此您不能在其中使用自定义顺序。
3楼
正如@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