2016-08-31 3 views
2

Я пытаюсь изменить форму данных, чтобы создать своего рода матрицу вхождения, но безуспешно.pandas: матрица совпадения с get_dummies

pandas.get_dummies() Правильный способ сделать это вообще?

Вот что я пытался до сих пор

import pandas as pd 

xlst_entries = [[u'aus', u'fra', u'gbr'],[u'gbr', u'prt'],[u'chn'],[u'bel', u'gbr'],[u'gbr', u'prt'],[u'gbr', u'prt'],[u'gbr', u'prt']] 

qq1 = pd.DataFrame(xlst_entries) 

qq2 = pd.get_dummies(data= qq1, prefix=None) 
qq2 

Но результат я хочу

index fra bel  chn  prt  aus  gbr 

0 1 0 0 0 1 1 
1 0 0 0 1 0 1 
2 0 0 1 0 0 0 
3 0 1 0 0 0 1 
4 0 0 0 1 0 1 
5 0 0 0 1 0 1 
6 0 0 0 1 0 1 

ответ

1

Можно настроить параметры внутри get_dummies таким образом, что prefix колонн, образованных удаляют и суммировать столбцы с таким же названием, чтобы получить желаемый кадр.

df = pd.get_dummies(df, prefix='', prefix_sep='') 

df.groupby(df.columns, axis=1).agg(np.sum).astype(int) 

    aus bel chn fra gbr prt 
0 1 0 0 1 1 0 
1 0 0 0 0 1 1 
2 0 0 1 0 0 0 
3 0 1 0 0 1 0 
4 0 0 0 0 1 1 
5 0 0 0 0 1 1 
6 0 0 0 0 1 1 
1

Вы можете сделать некоторые предварительную обработку xlst_entries, чтобы объединить все элементы в виде одной строки, разделенные |, затем используйте Series.str.get_dummies:

xlst_entries = ['|'.join(x) for x in xlst_entries] 
qq1 = pd.Series(xlst_entries).str.get_dummies() 

Полученный выход:

aus bel chn fra gbr prt 
0 1 0 0 1 1 0 
1 0 0 0 0 1 1 
2 0 0 1 0 0 0 
3 0 1 0 0 1 0 
4 0 0 0 0 1 1 
5 0 0 0 0 1 1 
6 0 0 0 0 1 1 
1

Это несколько общей вспомогательная функция, которая должна работать на практически любой data.frame (написано в python2, для тестирования Python3, пожалуйста, убедитесь, чтобы обернуть map и reduce функции с list):

def get_multiple_dummies(dframe): 
    from functools import reduce 
    combined = [pd.get_dummies(dframe.iloc[:, i]) for i in range(len(dframe.columns))] 
    allcolumns = set(reduce(list.__add__, map(lambda y: y.columns.tolist(), 
     combined))) 
    combined = map(lambda x: pd.concat([x, pd.DataFrame(
     columns = filter(lambda y: y not in x.columns, 
     allcolumns))]), combined) 
    return reduce(lambda x,y: x.fillna(0)+y.fillna(0), combined) 

print get_multiple_dummies(qq1) 

    aus bel chn fra gbr prt 
0 1 0 0 1 1 0 
1 0 0 0 0 1 1 
2 0 0 1 0 0 0 
3 0 1 0 0 1 0 
4 0 0 0 0 1 1 
5 0 0 0 0 1 1 
6 0 0 0 0 1 1 

[7 rows x 6 columns] 
Смежные вопросы