通过序列输出Python解析

2024-05-15 12:01:35 发布

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

我从一个细菌群落的测序中得到了这些数据。 我知道一些基本的Python,并且正在完成我的教程中的codecade。 为了实用,请把OTU看作“物种”的另一个词

以下是原始数据的示例:

OTU ID   OTU Sum Lineage
591820   1083    k__Bacteria; p__Fusobacteria; c__Fusobacteria; o__Fusobacteriales; f__Fusobacteriaceae; g__u114; s__
532752   517     k__Bacteria; p__Fusobacteria; c__Fusobacteria; o__Fusobacteriales; f__Fusobacteriaceae; g__u114; s__
218456   346     k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__Bordetella; s__
590248   330     k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Alcaligenaceae; g__; s__
343284   321     k__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Burkholderiales; f__Comamonadaceae; g__Limnohabitans; s__

这些数据包括三件事:物种的参考号,该物种在样本中的数量,以及所述物种的分类。你知道吗

我要做的是,在为一个分类家族(在数据中被指定为f_x)找到一个序列的所有时间里进行累加。你知道吗

以下是所需输出的示例:

f__Fusobacteriaceae 1600
f__Alcaligenaceae  676
f__Comamonadaceae  321

这不是为了上课。我几个月前就开始学习python了,所以我至少能找到任何建议。我知道它是如何从做它的慢方法(复制和粘贴在excel中),所以这是为将来的参考。你知道吗


Tags: 数据示例物种分类otubacteriaproteobacteriabetaproteobacteria
3条回答

获取所有原始数据并首先对其进行处理,我的意思是对其进行结构化,然后使用结构化数据来执行任何类型的操作。 如果您有GB的数据,您可以使用elasticsearch。在本例中,输入原始数据并使用所需的字符串进行查询,然后获取所有条目并添加它们

如果文件中的行真的像这样,您可以

from collections import defaultdict
import re
nums = defaultdict(int)
with open("file.txt") as f:
    for line in f:
        items =  line.split(None, 2)  # Split twice on any whitespace
        if items[0].isdigit():
            key = re.search(r"f__\w+", items[2]).group(0)
            nums[key] += int(items[1])

结果:

>>> nums
defaultdict(<type 'int'>, {'f__Comamonadaceae': 321, 'f__Fusobacteriaceae': 1600, 
'f__Alcaligenaceae': 676})

另一种解决方案是使用^{}

from collections import Counter

counter = Counter()

with open('data.txt') as f:
    # skip header line
    next(f)
    for line in f:
        # Strip line of extraneous whitespace
        line = line.strip()

        # Only process non-empty lines
        if line:
            # Split by consecutive whitespace, into 3 chunks (2 splits)
            otu_id, otu_sum, lineage = line.split(None, 2)

            # Split the lineage tree into a list of nodes
            lineage = [node.strip() for node in lineage.split(';')]

            # Extract family node (assuming there's only one)
            family = [node for node in lineage if node.startswith('f__')][0]

            # Increase count for this family by `otu_sum`
            counter[family] += int(otu_sum)

for family, count in counter.items():
    print "%s %s" % (family, count)

有关None参数(匹配连续空格)的详细信息,请参见^{}的文档。你知道吗

相关问题 更多 >