分组,分类行和删除冗余

时间:2014-04-15 16:27:20

标签: python group-by bioinformatics

我有一个包含15列的输入文件,

con13   tr|M0VCZ1|  91.39   267 23  0   131 211 1   267 1   480 239 267 33.4    99.6
con13   tr|M8B287|  97.12   590 17  0   344 211 1   267 0   104 239 590 74.0    99.8
con15   tr|M0WV77|  92.57   148 11  0   73  516 1   148 2   248 256 148 17.3    99.3
con15   tr|C5WNQ0|  85.14   148 22  0   73  516 1   178 4   233 256 148 17.3    99.3
con15   tr|B8AQC2|  83.78   148 24  0   73  516 1   148 6   233 256 148 17.3    99.3
con18   tr|G9HXG9|  99.66   293 1   0   144 102 1   293 7   527 139 301 63.1    97.0
con18   tr|M0XCZ0|  98.29   293 5   0   144 102 1   293 2   519 139 301 63.1    97.0

我需要1)在每个con中进行分组和迭代(使用groupby),2)从最低到最高值排序行[2],3)如果行[0],行[8]和行看到每个组内部[9]是相似的,4)如果它们相似,删除重复元素并在新的.txt文件中打印结果,选择行[2]中具有最高值的文件,以便我的输出文件看起来像这样,

con13   tr|M8B287|  97.12   590 17  0   344 211 1   267 0   104 239 590 74.0    99.8
con15   tr|M0WV77|  92.57   148 11  0   73  516 1   148 2   248 256 148 17.3    99.3
con15   tr|C5WNQ0|  85.14   148 22  0   73  516 1   178 4   233 256 148 17.3    99.3
con18   tr|G9HXG9|  99.66   293 1   0   144 102 1   293 7   527 139 301 63.1    97.0

我尝试过的脚本,只打印一个con并且不排序,

from itertools import groupby
f1 = open('example.txt','r')
f2 = open('result1', 'w')
f3 = open('result2.txt','w')
for k, g in groupby(f1, key=lambda x:x.split()[0]): 
    seen = set()
    for line in g:
        hsp = tuple(line.rsplit())
if hsp[8] and hsp[9] not in seen:
    seen.add(hsp)
    f2.write(line.rstrip() + '\n') 
else:
    f3.write(line.rstrip() + '\n') 

1 个答案:

答案 0 :(得分:2)

使用csv模块为您预分割行并再次写出格式化数据,并在seen中使用元组(仅限第9和第10)列)跟踪类似的行:

import csv
from itertools import groupby
from operator import itemgetter

with open('example.txt','rb') as f1
    with open('result1', 'wb') as f2, open('result2.txt','wb') as f3):
        reader = csv.reader(f1, delimiter='\t')
        writer1 = csv.writer(f2, delimiter='\t')
        writer2 = csv.writer(f3, delimiter='\t')

        for group, rows in groupby(reader, itemgetter(0)):
            rows = sorted(rows, key=itemgetter(8, 9, 2))
            for k, rows in groupby(rows, itemgetter(8, 9)):
                # now we are grouping on columns 8 and 9,
                # *and* these are sorted on column 2
                # everything but the *last* row is written to writer2
                rows = list(rows)
                writer1.writerow(rows[-1])
                writer2.writerows(rows[:-1])

sorted(rows, key=itemgetter(2))调用会对第3列上的分组行进行排序(因此所有具有相同row[0]值的行)。

因为您希望仅将第2列中每列行数最高值的行(第8列和第9列等)写入第一个结果文件,我们再次将分组,但已排序在第8,9和2列(按此顺序),然​​后在第8列和第9列分组,为第2列按升序排序。最后一行写入result1,其余行写入{{ 1}}。