#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