我有一个案例,我有几百万个谜题解决方案,它们都属于这种格式:
10 | 12 | 13 | <14>|||
---|---|---|---|---|---|
55 | A | C | TG|||
66 | A | - | G | -||
77 | C | A | -T | [/tr>||
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}