Я хочу преобразовать категориальную переменную в числовую в Python
У меня есть датафрейм с категориальными переменными. Я хочу преобразовать их в числовые, используя следующую логику:
У меня есть 2 списка, один из которых содержит различные категориальные значения в столбце, а второй список содержит значения для каждой категории. Теперь мне нужно отобразить эти значения вместо этих категориальных значений.
Например:
List_A = ['A', 'B', 'C', 'D', 'E']
List_B = [3,2,1,1,2]
Мне нужно заменить A на 3, B на 2, C и D на 1 и E на 2.
Есть ли способ сделать это в Python.
Я могу сделать это, применяя множественные циклы for, но я ищу какой-то более простой способ или некоторую прямую функцию, если она есть.
Любая помощь очень ценится, спасибо заранее.
4 ответа
Создать картографический диктат
List_A = ['A','B','C','D','E',]
List_B = [3,2,1,1,2]
d=dict(zip(List_A, List_B))
new_list=['A','B','C','D','E','A','B']
new_mapped_list=[d[v] for v in new_list if v in d]
new_mapped_list
Или определите функцию и используйте карту
List_A = ['A','B','C','D','E',]
List_B = [3,2,1,1,2]
d=dict(zip(List_A, List_B))
def mapper(value):
if value in d:
return d[value]
return None
new_list=['A','B','C','D','E','A','B']
map(mapper,new_list)
Предположим, что df - это ваш фрейм данных, а "Category" - это название столбца, содержащего ваши категории:
df[df.Category == "A"] = 3,2, 1, 1, 2
df[(df.Category == "B") | (df.Category == "E") ] = 2
df[(df.Category == "C") | (df.Category == "D") ] = 1
Если вам нужно только заменить значения в одном списке на значения другого, и структура будет такой же, как вы говорите. Два списка, одинаковой длины и той же позиции, то вам нужно только это:
list_a = []
list_a = list_b
Было бы более запутанное решение с такой функцией, которая создаст словарь, который вы можете использовать в других списках:
# we make a function
def convert_list(ls_a,ls_b):
dic_new = {}
for letter,number in zip(ls_a,ls_b):
dic_new[letter] = number
return dic_new
Это создаст словарь с нужными вам комбинациями. Вы передаете два списка, затем вы можете использовать этот словарь в другом списке:
List_A = ['A','B','C','D','E']
List_B = [3,2,1,1,2]
dic_new = convert_list(ls_a, ls_b)
other_list = ['a','b','c','d']
for _ in other_list:
print(dic_new[_.upper()])
# prints
3
2
1
1
ура
Вы можете использовать решение из модуля машинного обучения scikit-learn.
OneHotEncoder
LabelEncoder
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
Панды "трудным" способом:
/questions/47875053/stolbets-slovarya-v-pande/47875083#47875083