Python很快就把列表变成了许多小词典



我有一个案例,我有几百万个谜题解决方案,它们都属于这种格式:

<14>TG--[/tr>
10 12 13
55 A C
66 A - G
77 C AT
88 - A G

如果我正确理解这个问题,应该可以使用panda来处理它。

生成一些样本数据:

import pandas as pd
import numpy as np
rng = np.random.default_rng(0)
a = rng.choice(list('ACTG-'), (10, 5))
ids = pd.DataFrame(rng.integers(101, 104, 10), columns = ['ID'])
vals = pd.DataFrame(a, columns = [10, 20, 30, 40, 50])
df = pd.concat([ids, vals], axis=1)
print(df)

这给出:

ID 10 20 30 40 50
0  103  -  G  T  C  C
1  102  A  A  A  A  -
2  102  G  -  T  G  -
3  103  G  G  T  T  -
4  103  C  -  G  A  C
5  103  -  T  A  G  G
6  102  -  A  A  -  A
7  103  T  A  C  T  T
8  103  T  A  A  A  A
9  102  G  T  G  C  G

计算计数:

counts = (df.melt(['ID'])
.groupby(by=['ID', 'variable', 'value'])
.size()
.unstack(level=2)
.fillna(0)
.astype(int))
print(counts)

输出:

value         -  A  C  G  T
ID  variable               
102 10        1  1  0  2  0
20        1  2  0  0  1
30        0  2  0  1  1
40        1  1  1  1  0
50        2  1  0  1  0
103 10        2  0  1  1  2
20        1  2  0  2  1
30        0  2  1  1  2
40        0  2  1  1  2
50        1  1  2  1  1

然后,您可以从每一行中检索数据作为字典。例如:

counts.loc[103, 10].to_dict()

给出:

{'-': 2, 'A': 0, 'C': 1, 'G': 1, 'T': 2}

如果你喜欢嵌套字典形式的结果,你可以添加:

counts_d = (counts
.groupby(by='ID')
.apply(lambda g: g.droplevel(0).T.to_dict())
.to_dict())

counts_d[103][10]给出:

{'-': 2, 'A': 0, 'C': 1, 'G': 1, 'T': 2}

最新更新