我现在已经生成了一个字典,如下所示:
{'G1':['PF101','PF201','PF204','PF101'],'G2':['PF101','PF202'],'G3':
['PF202','PF204','PF305'],'G4':['PF101','PF305','PF305','PF201']}
Run Code Online (Sandbox Code Playgroud)
我想用它来创建一个制表符分隔计数表,看起来像:
PF101 PF201 PF204 PF202 PF305
G1 2 1 1 0 0
G2 1 0 0 1 0
G3 0 0 0 1 1
G4 1 1 0 0 2
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到一种有效的方法来做到这一点,所以任何建议都会非常有帮助.(供参考实际字典有~2,000个键)
好吧,我不知道这是一个普通的蟒蛇问题(而不是熊猫)...好吧,你知道吗,熊猫完全适合这里!
如果您没有,请安装它.这是为了这样的东西.
Run Code Online (Sandbox Code Playgroud)pip install pandas
选项1a
您可以明智地构建数据框,并调用melt结果.最后,用于pd.crosstab计算计数.
import pandas as pd
v = pd.concat([pd.Series(v, name=k) for k, v in d.items()], 1).melt()
pd.crosstab(v.variable, v.value)
value PF101 PF201 PF202 PF204 PF305
variable
G1 2 1 0 1 0
G2 1 0 1 0 0
G3 0 0 1 1 1
G4 1 1 0 0 2
Run Code Online (Sandbox Code Playgroud)
在这里,d是你的输入字典.
选项1b
或者,用于pd.DataFrame.from_dict加载数据; 的代码的其余部分是相同的,具有小的变化的melt和crosstab语法从其中指定了列名的点.
v = pd.DataFrame.from_dict(d, orient='index').reset_index().melt('index')
pd.crosstab(v['index'], v.value)
value PF101 PF201 PF202 PF204 PF305
index
G1 2 1 0 1 0
G2 1 0 1 0 0
G3 0 0 1 1 1
G4 1 1 0 0 2
Run Code Online (Sandbox Code Playgroud)
选项2 +的
另一个选项:stackstr.get_dummies
pd.DataFrame.from_dict(d, orient='index')\
.stack()\
.str.get_dummies()\
.sum(level=0)\
.sort_index()
PF101 PF201 PF202 PF204 PF305
G1 2 1 0 1 0
G2 1 0 1 0 0
G3 0 0 1 1 1
G4 1 1 0 0 2
Run Code Online (Sandbox Code Playgroud)
一个类似的解决方案pd.get_dummies虽然我下注str.get_dummies稍快一点.
v = pd.DataFrame.from_dict(d, orient='index')\
.stack()\
.reset_index(level=1, drop=True)
pd.get_dummies(v).sum(level=0)
PF101 PF201 PF202 PF204 PF305
G2 1 0 1 0 0
G3 0 0 1 1 1
G1 2 1 0 1 0
G4 1 1 0 0 2
Run Code Online (Sandbox Code Playgroud)
选项3
get_dummies + dot.这是我从piRSquared学到的东西.
v = pd.DataFrame.from_dict(d, orient='index').stack()
pd.get_dummies(v.index.get_level_values(0)).T.dot(pd.get_dummies(v.values))
PF101 PF201 PF202 PF204 PF305
G1 2 1 0 1 0
G2 1 0 1 0 0
G3 0 0 1 1 1
G4 1 1 0 0 2
Run Code Online (Sandbox Code Playgroud)
细节
它的作用是从一个,一个,索引和两个值创建OHE.
pd.get_dummies(v.index.get_level_values(0))
G1 G2 G3 G4
0 0 1 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 1 0
4 0 0 1 0
5 1 0 0 0
6 1 0 0 0
7 1 0 0 0
8 1 0 0 0
9 0 0 0 1
10 0 0 0 1
11 0 0 0 1
12 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
和,
pd.get_dummies(v.values)
PF101 PF201 PF202 PF204 PF305
0 1 0 0 0 0
1 0 0 1 0 0
2 0 0 1 0 0
3 0 0 0 1 0
4 0 0 0 0 1
5 1 0 0 0 0
6 0 1 0 0 0
7 0 0 0 1 0
8 1 0 0 0 0
9 1 0 0 0 0
10 0 0 0 0 1
11 0 0 0 0 1
12 0 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
最后,找到这两个张量的点积,结果是交叉列表.