Преобразование категориальных переменных в числа на основе частоты в одной строке - PullRequest
0 голосов
/ 16 сентября 2018

Это похоже на LabelEncoder из scikit-learn, но с требованием, чтобы присвоения числовых значений происходили в порядке частоты категории, т. Е. Более высокой / самой низкой категории ( в зависимости от варианта использования) число.

например. Если переменная может принимать значения [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.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Если вы используете панд, вы можете использовать метод map() :

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 для поиска уникальных значений присутствуетв столбце, который возвращает значения в алфавитном порядке, поэтому вы не можете использовать в нем пользовательский порядок.

0 голосов
/ 17 сентября 2018

В соответствии с предложением @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
0 голосов
/ 16 сентября 2018

См. argsort:

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

возвращает

  Category  Frequency  Order
0        a          5      3
1        b         10      1
2        c          2      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...