首页 > 解决方案 > 将核苷酸序列转换为二维整数数组

问题描述

我正在尝试使用以下映射将核苷酸转换为整数:

A -> 0
C -> 1
G -> 2
T -> 3

核苷酸序列保存在 pandas 数据框中,如下所示:

           0
0   GGATAATA
1   CGATAACC

我已经使用 df.apply() 方法来完成任务。这是代码:

import pandas as pd
a = ["GGATAATA","CGATAACC"]
d = dict(zip('A C G T'.split(), range(4)))
df = pd.DataFrame(a)
mapping = df[0].apply(lambda s: np.array([d[i] for i in s]))

它返回以下一维 numpy 数组:

print(mapping.values)
array([array([2, 2, 0, 3, 0, 0, 3, 0]), array([1, 2, 0, 3, 0, 0, 1, 1])],
      dtype=object)

但是,预期的输出应该是二维数组:

[[2,2,0,3,0,0,3,0],
[1,2,0,3,0,0,1,1]]

标签: python-3.xpandasnumpy

解决方案


使用map

list(map(lambda x: list(map(lambda c: d[c], list(x))), df[0]))

输出

[[2, 2, 0, 3, 0, 0, 3, 0], [1, 2, 0, 3, 0, 0, 1, 1]]

或者

df[0].agg(list).explode().replace(d).groupby(level=0).agg(list).tolist()

我认为第一个解决方案更快

%%timeit
list(map(lambda x: list(map(lambda c: d[c], list(x))), df[0]))
11.7 µs ± 392 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
df[0].agg(list).explode().replace(d).groupby(level=0).agg(list).tolist()
5.02 ms ± 697 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

推荐阅读