2017-02-13 13 views
5

Konwertuję ciągi znaków do wartości kategorycznych w moim zestawie danych za pomocą następującego fragmentu kodu.Jakikolwiek sposób na odwzorowanie enkodera etykiet w pandach Pythona?

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

Dla np,

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

Po kodującego tygodnia, mój zestaw danych wygląda następująco:

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

Czy jest jakiś sposób mogę wiedzieć, że niedziela została odwzorowana do 3, Środa do 6 i tak dalej?

Odpowiedz

7

Najlepszym sposobem osiągnięcia tego celu może być użycie etykiety koder biblioteki sklearn.

coś takiego:

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

Po pierwsze, upewnij się kategoryczne serii:

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

Następnie sprawdzić swoje "kategorie":

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

Można tworzyć dodatkowe słownika z mapowaniem:

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

Istnieje wiele sposobów, aby to zrobić. Można rozważyć pd.factorize, sklearn.preprocessing.LabelEncoder itd. Jednak w tym konkretnym przypadku, masz dwie opcje, które będzie Ci odpowiadać najlepsze:

Przechodzenie przez własną metodę, można dodać kategorie:

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

Inny opcja jest mapowanie wartości bezpośrednio przy użyciu dict

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

prosty & elegancki sposób, aby zrobić to samo.

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

i jesteś zrobić, sprawdź poniżej

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

W przypadku, gdy nie wiem, co odrębne wartości idą w danych, tworząc listę twardych zakodowanych wartości może przeciekać. Jednak LabelEncoder() radzi sobie z tym, co wchodzi w drogę. – Himanshu

Powiązane problemy