python-3.x - 将核苷酸序列转换为二维整数数组
问题描述
我正在尝试使用以下映射将核苷酸转换为整数:
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]]
解决方案
使用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)
推荐阅读
- python-3.x - 如何将 .pcd 文件中的所有点导入 2d python 数组
- linux - 将 dvb-apps tarball 编译到 Solaris 10 SPARC
- node.js - 如何比较nodejs中的两个日期
- c++ - 为什么编译器在尝试使用 C++11 样式初始化对象数组时隐式删除构造函数
- google-chrome - 找不到 Chrome://flags/#enable-tab-audio-muting
- r - 通过R向discord bot发送复杂消息
- python - TensorFlow Tokenize by Unique CSV Row 而不是 Unique Word in Row
- apache-kafka-streams - 构建一个 Kafka Stream,将不同 id 的列表返回到时间间隔
- python - 无法将文件从 sagemaker 笔记本上传到 S3
- c++ - ArrayFire 是否具有像 OpenCV 这样的边界矩形功能?