Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python为生物学家创建矩阵_Python_Matrix_Bioinformatics - Fatal编程技术网

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

使用python为生物学家创建矩阵,python,matrix,bioinformatics,Python,Matrix,Bioinformatics,我问这个问题是对许多生物学家/生物信息学研究人员来说的,他们发现很难从他们的基因表达数据构建矩阵,我试着用谷歌搜索并找到答案,我很惊讶他们中没有多少人特别解决这个问题,我在过去也问过同样的问题,但这是不可执行的,这是典型的问题 可能会有不同的文件,其中的行带有gene_id,列带有分数和其他元信息,例如sample1通常有200000行 gene_id score metainfo1 metainfo2 gene1 20 constitutive donor gene2 30 alt

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

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

gene_id score metainfo1 metainfo2
gene1   20  constitutive donor
gene2   30  alternative  acceptor 
理想情况下,对于下游分析,生物学家总是希望构建一个矩阵,首先从所有文件中收集所有基因id,并将其放在第1列,然后从每个文件基因id中附加分数,如果分数不可用,则添加一个“0”,类似这样的内容,并将分数的列名保留为文件名(metainfo可以是可选的,有时可能需要)

如果有人能够使用python提供一个可以动态应用的分步过程,那么这将对有偏颇编程知识的生物学家大有帮助

unique_id col1 col2 col3 score col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 
有20个包含此数据的文件,需要使用

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
您可以使用数据帧读取数据

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"]
现在我们可以提取元信息(所有行,最后两列):

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

删除重复的行()

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

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

附录(2017年8月24日):更多文件 假设您实际上有20个
sample*.txt
文件

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

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)

欢迎来到stackoverflow!请看一看,不幸的是,我猜你的问题太广泛了,无法在这里得到答案。你好@Maximilian谢谢你的回答,如果这个问题没有在这里得到答案,我不知道还能去哪里,请看这个问题,我尝试过用我的数据做这个,但似乎不起作用。谢谢你能帮助我吗为此,请重新表述问题Thanksry biostars。您试图做什么还不完全清楚。我的最佳猜测是您想要合并多个文件。使用Pandas.Google It。将每个文件读入Pandas数据框。在公共数据元素上加入/合并数据框,该数据元素应为gene id。
ValueError:无法从重复数据中重新索引axis
是我所看到的错误get@novicebioinforesearcher对我来说,我发布的确切代码与我展示的数据一致。我使用的是python3,但我认为这不会有什么区别。问题发生在哪一步?我已经编辑了这个问题,因为我不知道如何将它添加到注释中。如何对多个文件使用相同的概念(比如20个文件)?
pd.concat
获取数据帧的列表,因此它可以是
pd.concat([sample1,sample2,sample3,…],axis=1)
pd.concat([meta1,meta2,meta3,…])
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
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)