从CSV加载str.get_dummies()熊猫df的问题

时间:2019-03-23 20:00:21

标签: python pandas dataframe

我有一个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 个答案:

答案 0 :(得分:0)

要获得所需的输出,您可以先将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)

这将使您更接近一点,但是对于一个ID,您会有多行

    '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