字典计数表

eri*_*ric 3 python dictionary

我现在已经生成了一个字典,如下所示:

{'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个键)

cs9*_*s95 7

好吧,我不知道这是一个普通的蟒蛇问题(而不是熊猫)...好吧,你知道吗,熊猫完全适合这里!

如果您没有,请安装它.这是为了这样的东西.

pip install pandas
Run Code Online (Sandbox Code Playgroud)

选项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加载数据; 的代码的其余部分是相同的,具有小的变化的meltcrosstab语法从其中指定了列名的点.

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)

最后,找到这两个张量的点积,结果是交叉列表.

  • 谢谢!这很完美,我不知道大熊猫可以做到这一切. (2认同)