使用 python 为生物学家创建矩阵

creating a matrix using python for biologist

我问的这个问题对于许多 biologist/bioinformatics 研究人员来说是普遍的,他们发现很难从他们的基因表达数据构建矩阵,我尝试谷歌搜索并找到答案我很惊讶他们并不多特别是解决这个问题,我过去也问过同样的问题,但它不可执行,这是典型的问题

会有不同的文件,行带有 gene_id,列带有分数和其他元信息,例如 sample1 通常有 200000 行

gene_id score metainfo1 metainfo2
gene1   20  constitutive donor
gene2   30  alternative  acceptor 

理想情况下,下游分析生物学家总是希望构建一个矩阵,首先从所有文件中收集所有 gene_ids 并将其放在第 1 列中,然后从每个文件中追加分数 gene_id 并且在哪里分数不可用添加“0”,类似这样,并将分数的列名称保留为文件名(元信息可以是可选的,有时可能是必需的)

gene_id score_sample1 score_sample2....score_samplen metainfo1 metainfo2

如果有人可以使用 python 贡献一个可以动态应用的分步过程,这将对具有偏斜编程知识的生物学家有很大帮助。

unique_id col1 col2 col3 score col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 

有 20 个包含此数据的文件需要仅用

制作一个矩阵(col 是元信息)
unique_id(from all files) score col3 col4 col7 col9 col14

谢谢。

假设我们有这两个文件:

$ cat sample1.txt 
gene_id score   metainfo1   metainfo2
gene1   20  constitutive    donor
gene2   30  alternative acceptor
$ cat sample2.txt 
gene_id score   metainfo1   metainfo2
gene1   20  constitutive    donor
gene3   30  alternative acceptor

您可以使用 pandas 数据帧读取数据。

import pandas as pd
sample1 = pd.read_table("sample1.txt", index_col=0)["score"]
sample2 = pd.read_table("sample2.txt", index_col=0)["score"]

合并 "horizontally" (axis=1) 并将缺失值更改为 0:

concatenated = pd.concat([sample1, sample2], axis=1).fillna(0)

设置新列名:

concatenated.columns = ["score_sample1", "score_sample2"]

现在我们可以提取元信息(所有行,最后两列):

meta1 = pd.read_table("sample1.txt", index_col=0).iloc[:,-2:]
meta2 = pd.read_table("sample2.txt", index_col=0).iloc[:,-2:]

合并"vertically"(默认"axis"参数为0):

meta = pd.concat([meta1, meta2])

删除重复行()

meta = meta[~meta.index.duplicated(keep="first")]

将它 "horizontally" 连接到分数:

concatenated = pd.concat([concatenated, meta], axis=1)

我们得到这个:

         score_sample1  score_sample2     metainfo1 metainfo2
gene_id                                                      
gene1             20.0           20.0  constitutive     donor
gene2             30.0            0.0   alternative  acceptor
gene3              0.0           30.0   alternative  acceptor

附录 (24/08/2017):包含更多文件

假设您实际上有 20 个 sample*.txt 个文件。

您可以通过生成 DataFrame 的列表来概括上述方法,如下所示:

import pandas as pd
filenames = ["sample%d" % n for n in range(1,21)]
samples = [pd.read_table(filename, index_col=0)["score"] for filename in filenames]
concatenated = pd.concat(samples, axis=1).fillna(0)
concatenated.columns = ["score_sample%d" % n for n in range(1, 21)]
metas = [pd.read_table(filename, index_col=0).iloc[:,-2:] for filename in filenames]
meta = pd.concat(metas)
meta = meta[~meta.index.duplicated(keep="first")]
concatenated = pd.concat([concatenated, meta], axis=1)