python - 根据多个 CSV 文件中找到的分类单元的频率创建一个表

标签 python bash shell csv bioinformatics

我有 12 个 .csv 文件,其中包含获取的分类名称及其频率(获取每个名称的次数)。我创建了一个主 .txt 文件,其中列出了在 12 个文件中至少发现一次的所有独特分类单元。我需要以 csv 格式创建一个串联表,其中行的标题是每个文件的名称,列的标题是主 .txt 中列出的所有唯一分类单元 文件。该表必须填充每个 .csv 输入文件中每个分类单元旁边的频率。尽管主列表包含 12 个文件中可能的所有分类单元,但并非所有文件都包含所有分类单元。当类群丢失时,我需要放置“0”。

.csv 输入:

$cat file_1

1,Salmo salar
12,Solanum pennellii
18,Staphylococcus xylosus
...

$cat file_2

1,Salmo salar
14,Staphylococcus xylosus
123,Strongyloides stercoralis
...

$cat file_3

123,Solanum pennellii
11,Staphylococcus xylosus
41,Strongyloides stercoralis
...

.txt 主列表:

$cat master

Salmo salar
Solanum pennellii
Staphylococcus xylosus
Strongyloides stercoralis
...

.csv 输出(我需要的):

Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
File_1,1,12,18,0    
File_2,1,0,14,123    
File_3,0,123,11,41   

我之前尝试制作一个没有主列表的小型 python 脚本,并使用包含重复的类群名称而不是频率的 .tsv 输入文件。我无法获得显示每个文件缺失分类单元的表格,因此我决定创建一个主列表并折叠输入文件。我对 python 很陌生,所以任何帮助将不胜感激。

最佳答案

您根本不需要主文件。我只是动态生成最终表。假设您将输入文件名作为命令行参数传递给 Python 脚本:

import sys
from collections import defaultdict

data = defaultdict(dict) # { taxon: { filename: count } }                                                               

for filename in sys.argv[1:]:
    with open(filename) as infile:
        for line in infile:
            count, taxon = line.rstrip().split(',')
            data[taxon][filename] = count

现在您有了数据,这是输出文件所需的一切。然后你可以像这样打印它:

taxa = data.keys()
print "Sample,{}".format(','.join(taxa))
for filename in sys.argv[1:]:
    print filename,
    for taxon in taxa:
        count = data[taxon].get(filename, "0")
        sys.stdout.write("," + count)
    print

关于python - 根据多个 CSV 文件中找到的分类单元的频率创建一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37107464/

相关文章:

shell - 如何在不实际解压缩的情况下查看 gzip 文件 “abc.gz” 的内容?

python - 将 KB/MB/GB 等字符串解析为数值

python - python 中的 xml2array

linux - 通过 omprog(syslog 模块)将命令行参数传递给 shell 脚本

linux - 删除具有相似名称的文件,匹配范围

bash - 将在 awk 中找到的文件名传递给 vim 命令

bash - 在shell脚本中获取进程的返回值

python - 如何使用 NLTK 正确进行多类分类?

python - 用 python 发送传真?

linux - Bash 初始化稀疏数组