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

时间:2017-04-18 21:44:15

标签: python matrix bioinformatics

我问这个问题一般对于许多生物学家/生物信息学研究人员来说,他们发现很难从他们的基因表达数据构建矩阵,我尝试使用谷歌搜索并找到答案我很惊讶他们中很少有人解决这个问题特别是,我过去曾问过同样但它不可执行,这是典型的问题

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

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

理想情况下,对于下游分析,生物学家总是希望构建一个矩阵,首先从所有文件中收集所有gene_id并将其放在第1列中,并在每个文件gene_id中添加分数,并且如果分数不可用则添加' 0',类似这样并保留得分的列名作为文件名(有时可能需要metainfo可选)

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是metainfo)
unique_id(from all files) score col3 col4 col7 col9 col14

感谢。

1 个答案:

答案 0 :(得分:2)

假设我们有这两个文件:

$ 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"]

将其“水平”合并(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:]

“垂直”合并(默认“轴”参数为0):

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

删除重复的行(https://stackoverflow.com/a/34297689/1878788

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

将它“水平”连接到分数:

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)