2014-10-07 98 views
0

我有一個設置了以下字段的表單:日期時間,ID和地址。這種形式自動分配每個條目的唯一ID字符串(U_ID),然後這個數據後輸出到與標題和行是這樣的一個CSV:Python - 選擇符合特定條件的所有行值一旦

Date Time  ID U_ID  Address 
9/12/13 12:07 13 adfasd 1345 Wilson Way 
9/12/13 13:45 8  jklj  1456 Jackson Hollow 
9/13/13 14:55 13 klidh 1345 Wilson Way 
9/13/13 15:00 8  ikodl 1456 Jackson Hollow 

我正在尋找一種方法,以消除那些重複提交通過Python腳本使用相同的ID,同時保留行中的其餘數據。理想情況下,我只想保留與csv文件中的ID關聯的第一個條目。

輸出應該是這個樣子:

Date Time  ID U_ID  Address 
9/12/13 12:07 13 adfasd 1345 Wilson Way 
9/12/13 13:45 8  jklj  1456 Jackson Hollow 

到目前爲止,我被困在:

import csv 

with open('/Users/user/Desktop/test.csv', 'rb') as f: 
r = csv.reader(f) 
headers = r.next() 
rows = [(Date Time, ID, U_ID, Address) for Date Time, ID, U_ID, Address in r] 
clean = [row for row in rows if row[1] != '#N/A'] 
clean2 = list(set(row[1])) 

這讓我只對ID的唯一值的列表,但我我不知道如何恢復與這些值的行相關的所有其他數據。

如前所述,如果我也能得到最早的提交,那將是美妙的,但老實說,ID的任何獨特提交都應該這樣做。

感謝您的閱讀!

回答

0

看看pandas,這是你會怎麼做:

import pandas as pd 

pd.read_table('test.csv')\ 
    .drop_duplicates(subset=['ID'])\ 
    .to_csv('output.csv', index=None, sep='\t') 

output.csv

Date Time ID U_ID Address 
9/12/13 12:07 13 adfasd 1345 Wilson Way 
9/12/13 13:45 8 jklj 1456 Jackson Hollow 
+0

工作就像一個魅力!謝謝Elyase! – roliv 2014-10-08 01:54:49

0

首先,上述文件是一個固定寬度的文件,而不是csv。使用固定寬度的字符串索引。

最簡單的方法是將獨特的零件存儲在一個集合中,以便快速檢查它們是否已經被看到過。

path = '/Users/user/Desktop/test.csv' 
already_read = set() 
with open(path, 'rb') as f: 
    header = f.readline().strip() 
    print header 
    for line in f: 
     unique_part = line[17:].strip() 
     if unique_part in already_read: 
      continue 
     already_read.add(unique_part) 
     print line.strip() 

如果該文件是一個TSV(製表符分隔文件),你可以使用split,而不是原始索引:

path = '/Users/user/Desktop/test.csv' 
already_read = set() 
with open(path, 'rb') as f: 
    header = f.readline().strip() 
    print header 
    for line in f: 
     unique_part = '\t'.join(line.strip().split('\t')[2:]) 
     if unique_part in already_read: 
      continue 
     already_read.add(unique_part) 
     print line.strip() 
相關問題