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

У меня есть некоторые данные, которые выглядят следующим образом:

    Owner   Label1  Label2  Label3      
    Bob     Dog     N/A     N/A 
    John    Cat     Mouse   N/A 
    Lee     Dog     Cat     N/A
    Jane    Hamster Rat     Ferret

И я хочу преобразовать их в одноразовое кодирование.Примерно так:

    Owner   Dog     Cat     Mouse    Hamster    Rat    Ferret   
    Bob     1       0       0        0          0      0
    John    0       1       1        0          0      0    
    Lee     1       1       0        0          0      0
    Jane    0       0       0        1          1      1

Я просмотрел документацию и стекопоток, но не смог определить соответствующие функции для достижения этой цели. get_dummies подходит довольно близко, но создает префикс для каждой категории только тогда, когда эта категория появляется в соответствующем столбце.

Ответы [ 4 ]

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

sklearn.preprocessing.MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer

o, l = zip(*[[o, [*filter(pd.notna, l)]] for o, *l in zip(*map(df.get, df))])

mlb = MultiLabelBinarizer()

d = mlb.fit_transform(l)
pd.DataFrame(d, o, mlb.classes_)

      Cat  Dog  Ferret  Hamster  Mouse  Rat
Bob     0    1       0        0      0    0
John    1    0       0        0      1    0
Lee     1    1       0        0      0    0
Jane    0    0       1        1      0    1

Тот же самый ответ

o = df.Owner
l = [[x for x in l if pd.notna(x)] for l in df.filter(like='Label').values]

mlb = MultiLabelBinarizer()

d = mlb.fit_transform(l)
pd.DataFrame(d, o, mlb.classes_)

       Cat  Dog  Ferret  Hamster  Mouse  Rat
Owner                                       
Bob      0    1       0        0      0    0
John     1    0       0        0      1    0
Lee      1    1       0        0      0    0
Jane     0    0       1        1      0    1
0 голосов
/ 18 сентября 2018

Используя

df.set_index('Owner').stack().str.get_dummies().sum(level=0)
Out[535]: 
       Cat  Dog  Ferret  Hamster  Mouse  Rat
Owner                                       
Bob      0    1       0        0      0    0
John     1    0       0        0      1    0
Lee      1    1       0        0      0    0
Jane     0    0       1        1      0    1

Или

s=df.melt('Owner')
pd.crosstab(s.Owner,s.value)
Out[540]: 
value  Cat  Dog  Ferret  Hamster  Mouse  Rat
Owner                                       
Bob      0    1       0        0      0    0
Jane     0    0       1        1      0    1
John     1    0       0        0      1    0
Lee      1    1       0        0      0    0
0 голосов
/ 18 сентября 2018

Функция pandas.get_dummies преобразует категориальные переменные в фиктивные / индикаторные переменные за один шаг

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

Вы можете использовать get_dummies для набора данных, затем сгруппировать и суммировать:

pd.get_dummies(df.set_index('Owner').stack()).groupby('Owner').sum()

       Cat  Dog  Ferret  Hamster  Mouse  Rat
Owner                                       
Bob      0    1       0        0      0    0
John     1    0       0        0      1    0
Lee      1    1       0        0      0    0
Jane     0    0       1        1      0    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...