我问这个问题一般对于许多生物学家/生物信息学研究人员来说,他们发现很难从他们的基因表达数据构建矩阵,我尝试使用谷歌搜索并找到答案我很惊讶他们中很少有人解决这个问题特别是,我过去曾问过同样但它不可执行,这是典型的问题
会有不同的文件,其中行包含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
感谢。
答案 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
假设您实际上有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)