2013-07-28 2 views
0

Я хотел бы иметь возможность сделать одну горячую кодировку в кадре данных на основе уровней из другого фрейма данных. Например, в приведенном ниже примере данные содержат уровни для двух переменных. Исходя из этих уровней, я хочу создать фиктивные переменные в data2.Фиктивные переменные из уровней другого фрейма данных

Как я могу это сделать?

import pandas as pd 

#unique levels (A,B for VAR1, and X,Y,Z for VAR2) in 
#this dataset determine the possible levels for the following dataset 
data = {'VAR1': ['A', 'A', 'A', 'A','B', 'B'], 

'VAR2': ['X', 'Y', 'Y', 'Y','X', 'Z']} 

frame = pd.DataFrame(data) 

#data2 contains same variables as data, but might or might not 
#contain same levels 

data2 = {'VAR1': ['A', 'C'], 

'VAR2': ['X', 'Y']} 

frame2 = pd.DataFrame(data2) 

#after applying one hot encoding to data2, this is what it should look like 

data_final = { 
'A': ['1', '0'], 
'B': ['0', '0'], 
'X': ['1', '0'], 
'Y': ['0', '1'], 
'Z': ['0', '0'], 
} 

frame_final = pd.DataFrame(data_final) 

ответ

1

Возможно, есть много способов достичь этого. По какой причине я делаю такой подход:

In [74]: part = pd.concat([pd.get_dummies(frame2[x]) for x in frame2], axis=1) 

In [75]: part 
Out[75]: 
    A C X Y 
0 1 0 1 0 
1 0 1 0 1 

Вы можете видеть, что мы уже почти там, только недостающие столбцы являются те, которые не показывают где-нибудь в frame2, B и Z. Опять будет несколько способов их добавления (мне было бы интересно узнать, что вы считаете более подходящими), но я хотел использовать метод reindex_axis. Чтобы использовать это, нам нужен еще один индекс, содержащий все возможные значения.

In [76]: idx = pd.Index(np.ravel(frame.values)).unique() 

In [77]: idx 
Out[77]: array(['A', 'X', 'Y', 'B', 'Z'], dtype=object) 

Наконец переиндексации и заполнить NaN с с 0:

In [78]: part.reindex_axis(idx, axis=1).fillna(0) 
Out[78]: 
    A X Y B Z 
0 1 1 0 0 0 
1 0 0 1 0 0 

Вы можете сортировать, если это необходимо.

+0

Спасибо, это помогло мне подумать о другом способе этого. – ADJ

Смежные вопросы