gpt4 book ai didi

python - 字典到计数表

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:36 25 4
gpt4 key购买 nike

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

{'G1':['PF101','PF201','PF204','PF101'],'G2':['PF101','PF202'],'G3':
['PF202','PF204','PF305'],'G4':['PF101','PF305','PF305','PF201']}

我想用它来创建一个制表符分隔的计数表,如下所示:

      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

我似乎找不到一种有效的方法来执行此操作,因此任何建议都会非常有帮助。 (作为引用,实际字典有大约 2,000 个键)

最佳答案

Well, I had no idea this was a general python question (and not pandas)... well, what do you know, pandas fits in perfectly here!

If you don't have it, please install it. It's meant for stuff like this.

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

这里,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

选项 2
stack + str.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

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

选项 3
get_dummies + 。这是我从 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

详情
它所做的是根据一个索引和两个值创建 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

还有,

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

最后求这两个张量的点积,结果就是一个交叉表。

关于python - 字典到计数表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48393069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com