2017-02-13 10 views
5

Я преобразовываю строки в категориальные значения в моем наборе данных, используя следующий фрагмент кода.Любой способ получить сопоставления кодера метки в Pandon pandas?

data['weekday'] = pd.Categorical.from_array(data.weekday).labels 

Для например,

index weekday 
0  Sunday 
1  Sunday 
2  Wednesday 
3  Monday 
4  Monday 
5  Thursday 
6  Tuesday 

После кодирования будний день, мой набор данных будет выглядеть так:

index weekday 
    0  3 
    1  3 
    2  6 
    3  1 
    4  1 
    5  4 
    6  5 

Есть ли способ, что я могу знать, что воскресенье было сопоставляется с 3, Среда до 6 и так далее?

ответ

7

Лучший способ сделать это может быть использование этикеток кодировщик библиотеки sklearn.

Что-то вроде этого:

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
le.fit(["paris", "paris", "tokyo", "amsterdam"]) 
list(le.classes_) 
le.transform(["tokyo", "tokyo", "paris"]) 
list(le.inverse_transform([2, 2, 1])) 
2

Во-первых, сделать категорический серия:

weekdays = pd.Series(['Sun', 'Sun', 'Wed', 'Mon', 'Mon']).astype('category') 

Затем осмотрите его "категории":

weekdays.cat.categories.get_loc('Sun') 
8

Вы можете создать дополнительный словарь с отображением:

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
le.fit(data['name']) 
le_name_mapping = dict(zip(le.classes_, le.transform(le.classes_))) 
print(le_name_mapping) 
{'Tom': 0, 'Nick': 1, 'Kate': 2} 
1

Есть много способов сделать это. Вы можете рассмотреть pd.factorize, sklearn.preprocessing.LabelEncoder и т.д. Однако, в данном конкретном случае, у вас есть два варианта, которые подойдут вам лучше всего:

Идя по собственному методу, вы можете добавить категории:

pd.Categorical(df.weekday, [ 
    'Sunday', 'Monday', 'Tuesday', 
    'Wednesday', 'Thursday', 'Friday', 
    'Saturday'] ).labels 

Другой опция для отображения значений непосредственно с помощью dict

df.weekday.map({ 
    'Sunday': 0, 
    'Monday': 1, 
    # ... and so on. You get the idea ... 
}) 
0

простого & элегантного способа сделать то же самое.

cat_list = ['Sun', 'Sun', 'Wed', 'Mon', 'Mon'] 
encoded_data, mapping_index = pd.Series(cat_list).factorize() 

и вы сделали, проверьте ниже

print(encoded_data) 
print(mapping_index) 
print(mapping_index.get_loc("Mon")) 
+0

В случае, если вы не знаете, что различные значения приходят в данных, создавая список жестких закодированных значений может произойти утечка. LabelEncoder(), однако, имеет дело с тем, что происходит. – Himanshu