2016-12-17 39 views
0
csv文件的

小部分是像下面几行:选择一排的基础上与其他的Python列

481116 ABCF3 466 0 ENSG00000161204 0 
485921 ABCF3 466 0 ENSG00000161204 0 
489719 ABCF3 466 0 ENSG00000161204 0 
498136 ABCF3 466 2 ENSG00000161204 0.0019723866 
273359 ABHD10 326 78 ENSG00000144827 0.0301158301 
491580 ABHD10 326 0 ENSG00000144827 0 
493784 ABHD10 326 0 ENSG00000144827 0 
494817 ABHD10 326 1 ENSG00000144827 0.0012484395 

列通过","文件中分离出来。在第二列中有许多重复的ID,我想根据第6列中的值仅选择一个ID。换句话说,对于每个id我想选择列6中最高数字的那个。 上述部分的结果必须是这样的。

498136 ABCF3 466 2 ENSG00000161204 0.0019723866 
273359 ABHD10 326 78 ENSG00000144827 0.0301158301 

我曾试图弥补它在Python和写代码的一些作品在下面的框架,但他们的工作非:

with open('data.csv') as f, open('out.txt', 'w') as out: 
    line = [line.split(',')for line in f] 
    . 
    . 
    out.write(','.join(results)) 
+0

是否保证第二列中具有相同id的行在文件中是连续的?你有任何大小或速度限制 - 即。将整个文件读入内存然后进行行选择有什么问题吗?有没有理由不使用内置的csv阅读器?是否有理由不向我们展示(部分)实际文件?你能告诉我们你的一个尝试吗(你的“框架”在你的部分显示很少的努力)? –

+0

是的,这可以保证第二列中具有相同id的行在文件中是连续的。小例子是我的文件的一部分,但我在Excel中打开,所以,这就是为什么你可以看到像选项卡分隔 – user7249622

+0

我试图做一个字典,并选择第二列作为关键和第六列作为价值。这部分工作,但当我试图做过滤它没有工作 – user7249622

回答

1

you_data.csv:

481116,ABCF3, 466,0, ENSG00000161204,0 
485921,ABCF3, 466,0, ENSG00000161204,0 
489719,ABCF3, 466,0, ENSG00000161204,0 
498136,ABCF3, 466,2, ENSG00000161204,0.0019723866 
273359,ABHD10,326,78,ENSG00000144827,0.0301158301 
491580,ABHD10,326,0, ENSG00000144827,0 
493784,ABHD10,326,0, ENSG00000144827,0 
494817,ABHD10,326,1, ENSG00000144827,0.0012484395 

代码:

import csv 
from collections import defaultdict 

with open('you_data.csv', newline='') as f, open('out.csv', 'w', newline='') as out: 
    f_reader = csv.reader(f) 
    out_writer = csv.writer(out) 
    d = defaultdict(list) 
    for line in f_reader: 
     d[line[1]].append(line) 
    for _,v in d.items(): 
     new_line = sorted(v, key=lambda i:float(i[5]), reverse=True)[0] 
     out_writer.writerow(new_line) 

out.csv:

498136,ABCF3, 466,2, ENSG00000161204,0.0019723866 
273359,ABHD10,326,78,ENSG00000144827,0.0301158301 
相关问题