2014-10-07 67 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() 
相关问题