首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据在多个CSV文件中找到的分类法的频率创建一个表

根据在多个CSV文件中找到的分类法的频率创建一个表
EN

Stack Overflow用户
提问于 2016-05-09 03:47:47
回答 3查看 85关注 0票数 1

我有12个.csv文件,其中包含获取的分类名称及其频率(每个名称被获取的次数)。我已经创建了一个主.txt文件,列出了至少在这12个文件中找到的所有唯一分类单元。我需要制作一个csv格式的连接表,其中行的头是每个文件的名称,列的头都是主.txt文件中列出的唯一分类法。该表必须填充每个.csv输入文件中每个分类法旁边的频率。虽然主列表包含12个文件中可能包含的所有分类法,但并非所有文件都包含所有分类法。当分类单元丢失时,我需要放一个'0‘。

.csv输入:

代码语言:javascript
运行
复制
$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主列表:

代码语言:javascript
运行
复制
$cat master

Salmo salar
Solanum pennellii
Staphylococcus xylosus
Strongyloides stercoralis
...

.csv输出(我需要的):

代码语言:javascript
运行
复制
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是个新手,所以任何帮助都会很感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-09 06:21:00

对于即将到来的awk,我们向您致敬!

awk是为这样的处理创建的。

试一试:

代码语言:javascript
运行
复制
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")
   }
 }'

测试:

代码语言:javascript
运行
复制
$ 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
票数 0
EN

Stack Overflow用户

发布于 2016-05-09 05:21:12

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

代码语言:javascript
运行
复制
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,它是输出文件所需的一切。然后,您可以这样打印它:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-05-09 05:23:17

尝试使用csv.Dictwriter.

  1. 将12个文件读入文件名= {species_name: count,species_name:count}格式的字典中。
  2. 将master_list txt文件读入列表
  3. 使用csv.Dictwriter,它将从您创建的字典中编写csv文件。如果文件中没有物种的数据,可以将其指定为0。您的标题将是来自master_list的物种列表。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37107464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档