从多个CSV文件中发现的分类群频率创建一个表

2024-06-25 22:50:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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很陌生,所以任何帮助都将不胜感激。你知道吗


Tags: 文件csv名称列表分类cat频率salar
3条回答

对于那些即将awk的人,我们向你们致敬!你知道吗

awk是为这种处理而创建的。你知道吗

试一试:

awk -F "," -v OFS="," '
 FNR==1 {samples[++fni]=FILENAME}
 {if (!taxakeys[$2]) {taxakeys[$2]=1; taxas[++ti]=$2};frequencies[samples[fni],$2]+=$1}
 END {
   printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n") 
   for (i=1; i<=fni; i++) {
     printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
   }
 }'

测试:

$ awk -F "," -v OFS="," '
 FNR==1 {samples[++fni]=FILENAME}
 {if (!taxakeys[$2]) {taxakeys[$2]=1; taxas[++ti]=$2};frequencies[samples[fni],$2]+=$1}
 END {
   printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n") 
   for (i=1; i<=fni; i++) {
     printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
   }
 }' file_*

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

尝试使用csv.Dictwriter文件。你知道吗

  1. 把你的12个文件读入一个格式为filename={species\u name:count,species的字典_姓名:count}. 你知道吗
  2. 将主目录txt文件读入一个列表
  3. 使用csv.Dictwriter文件它将从您创建的词典中写入一个csv文件。如果文件中没有某个物种的数据,可以将其指定为0。你的头将是从主目录的物种列表。你知道吗

你根本不需要主文件。我只是动态生成最终的表。假设将输入文件名作为命令行参数传递给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

现在有了data,这就是输出文件所需的一切。然后可以这样打印:

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

相关问题 更多 >