Проблемы с загрузкой str.get_dummies () panda df из csv

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть CSV-файл, содержимое которого содержит экспертов и список навыков, которые он / она знает, примерно как показано ниже

 0   'Performance'   'Data'  
1   'Compiling' 'Algorithms'    
3   'Data'  'Algorithms'    
  

Я хочу создать матрицу 0-1, на основе того, какие навыки принадлежат какому эксперту

Что-то вроде

 ID    Performance Data Compiling Algorithms 
0              1    1      0        0
1              0    0      1        1
2              0    1      0        1  
  

А затем позже сохраните эту матрицу в словаре, например

 (0,Performance): 1, (0:Data):1 , (0:Compiling):0, (0:Algorithms):0
(1,Performance): 0, (1:Data):0 , (1:Compiling):1, (1:Algorithms):1
(2,Performance): 0, (2:Data):1 , (2:Compiling):0, (2:Algorithms):1
  

Моя попытка до сих пор была

 df1 = pd.read_csv('Expert_Skill_10KNodes.csv', sep=";")

df2= (df1.iloc[:,0].str.get_dummies(sep=','))

import itertools
Expert_Skill=({(x,y):df2[y][x] for x, y in list(itertools.product(df2.index, df2.columns))})
  

Код выполняется без ошибок, но не выдает желаемый результат, он просто пропускает большинство навыков, которыми обладает эксперт

Ответ №1:

Чтобы получить желаемый результат, вы можете сначала применить его pd.dummy_values() к каждому столбцу, а затем применить по столбцам np.sum следующим образом.

     id  skill1  skill2
1   0   'Performance'   'Data'
2   1   'Compiling' 'Algorithms'
3   3   'Data'  'Algorithms'
  

Учитывая приведенный выше pd.DataFrame

  import pandas as pd
 dummy_dataframes = [pd.get_dummies(df[skill_col]) for skill_col in ['skill1', 'skill2']
 dummy_concat = pd.concat(dummy_dataframes).fillna(0).astype(int)
  

Это даст вам что-то более близкое, но у вас есть несколько строк для одного идентификатора

     'Algorithms'    'Compiling' 'Data'  'Performance'
1   0   0   0   1
2   0   1   0   0
3   0   0   1   0
1   0   0   1   0
2   1   0   0   0
3   1   0   0   0
  

Что вы можете сделать сейчас, так это просто применить по столбцам np.sum .

 import numpy as np
dummy_concat.reset_index().groupby('index').apply(np.sum, axis=0).drop('index',axis=1)
  

Чтобы получить желаемый результат.

 'Algorithms'    'Compiling' 'Data'  'Performance'

1   0   0   1   1
2   1   1   0   0
3   1   0   1   0