如何使用要比较的特定列基于另一个CSV中的行删除一个CSV中的行

时间:2015-01-14 22:25:16

标签: python loops csv compare

我有两个CSV文件,CSV1CSV2,包含多个列和行。其中一列标题为ID

我想要做的是检查CSV1行,如果ID的{​​{1}}列中有CSV2匹配ID的行CSV1,然后我想保留该行。如果没有匹配项,那么我想从ID删除该行。

基本上CSV1中的数据与我有关,但只与CSV1中的人有关。两者之间的唯一连接是CSV2列。因此,我需要检查ID中的所有行,以查看该行CSV1是否在ID中的行中。

这是我到目前为止所拥有的。

CSV2

我已经可以说我没有走上正轨,所以有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

您可以提取第二个文件中的所有ID,并在每次检查第一个文件的其中一行时查看这些ID。

例如:

# extract ID column from CSV file 2 into a set
Ids = { row[1] for row in smartee }

# pick only rows whose ID is in Ids 
filtered_rows = [item for item in aeries if item[1] in Ids] 

答案 1 :(得分:1)

根据您计划处理相关数据行的计划,您可以使用Python的内置filter()函数来执行您所需的操作:

import csv

# first get the ids    
with open('Smartee.csv', 'rb') as smarteeCSV:  # CSV2
    ids = set(row['ID'] for row in csv.DictReader(smarteeCSV, delimiter=','))

with open('aeriesEditable.csv', 'rb') as aeriesCSV:  # CSV1
    relevant = filter(lambda row: if row['ID'] in ids,
                        csv.DictReader(aeriesCSV, delimiter=','))

# relevant will be a list containing the desired rows from CSV1

如果要迭代处理行,对于第二部分,您可以使用for循环来代替调用itertools.ifilter()函数的结果。

答案 2 :(得分:0)

首先,阅读CSV2以制作一组ID:

with open(CSV2) as f:
    r = csv.DictReader(f)
    theids = set(row['ID'] for row in r)

然后,在读取CSV1时,只需检查ID是否在集合中:

with open(CSV1) as f, open(CSV1 + '.new', 'w') as out:
    r = csv.DictReader(r)
    w = csv.DictWriter(out, r.fieldnames)
    for row in r:
        if row['ID'] in theids:
            w.writerow(row)

这假设CSV文件适用于基于dict的读/写(即第一行是列名列表),但如果列名也来自其他信息,则很容易调整。