python - 从 csv 加载 str.get_dummies() panda df 的问题
问题描述
我有一个 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))})
代码运行没有错误,但没有产生所需的输出,它只是跳过了专家拥有的大部分技能
解决方案
要获得所需的输出,您可以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
您现在可以做的就是应用 column-wise 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
推荐阅读
- android - 如何从 Kotlin 的 SearchView 中正确检索数据?
- java - 将图像绘制为多边形
- c# - XmlSerializer 生成重复序列的错误顺序
- javascript - 如何在Angular 7中使用+登录验证国家代码?
- node.js - nodejs中的哈希与终端中的哈希不同
- android - 如何在 Android 中通过数据绑定访问 Kotlin Lambda 函数
- spring-boot - 如何在 Docker/Kubernetes 中为 Java 安装自签名证书?
- selenium - groovy.lang.MissingMethodException:没有方法签名:使用机器人类上传文件时出现以下错误
- git - git merge:我是如何在 BASE 文件中遇到冲突的?
- azure-devops - Azure Devops 服务 TFVC 存储库 - 成本