2016-12-17 48 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