2016-02-29 2 views
2

У меня есть dataframe, который выглядит как:создать несколько столбцов из списка значений другого столбца

Groupe  Id MotherName FatherName Field 
Advanced 56 Laure   James  English-107,Economics, Management, History, Philosophy 
Middle  11 Ann   Nicolas  Web-development, Java-2 
Advanced 6  Helen   Franc  Literature, English-2 
Beginner 43 Laure   James  Mathematics, History, Philosophy, Literature 
Middle  14 Naomi   Franc  Java-2, Management, English-107 

Для дальней работы с данными, мне нужно разделить Field колонки, и заменить его с несколькими столбцами, будет выглядеть так:

Id English-107 Economics Management History Web-development Java-2 Literature English-2 Mathematics Philosophy 
56  1   1   1   1   0   0  0    0   0   1 
11  0   0   0   0   1   1  0    0   0   0 

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

pd.DataFrame(df.Field.str.split(',',1).tolist()) 

не решает мою ПРОБЛЕМЕ, потому что мне нужны столбцы, основанные не только на позиции в списке, но на основе каждого уникального значения в списке. Вы знаете, как я могу подойти к нему?

+0

Ты после 'ДХ. cata.str.split (',', expand = True) ' – EdChum

ответ

2

Вы можете использовать concat и str.get_dummies:

print pd.concat([df['Id'], df['Field'].str.get_dummies(sep=",")], axis=1) 
    Id Economics English-107 English-2 History Java-2 Literature \ 
0 56   1   1   0  1  0   0 
1 11   0   0   0  0  1   0 
2 6   0   0   1  0  0   1 
3 43   0   0   0  1  0   1 
4 14   0   1   0  0  1   0 

    Management Mathematics Philosophy Web-development 
0   1   0   1    0 
1   0   0   0    1 
2   0   0   0    0 
3   0   1   1    0 
4   1   0   0    0 

Если вам нужно подсчитать значения, вы можете использовать pivot_table (добавить одну строку Economics для тестирования):

df1 = df['Field'].str.split(',',expand=True).stack() 
              .groupby(level=0) 
              .value_counts() 
              .reset_index() 
df1.columns=['a','b','c'] 
print df1.pivot_table(index='a',columns='b',values='c').fillna(0) 
b Economics English-107 English-2 History Java-2 Literature Management \ 
a                    
0   2   1   0  1  0   0   1 
1   0   0   0  0  1   0   0 
2   0   0   1  0  0   1   0 
3   0   0   0  1  0   1   0 
4   0   1   0  0  1   0   1 

b Mathematics Philosophy Web-development 
a            
0   0   1    0 
1   0   0    1 
2   0   0    0 
3   1   1    0 
4   0   0    0 
+0

классное решение, не знал, что' get_dummies' имеет параметр separator, я использовал только однозначные столбцы – maxymoo

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