[英]How do I delete rows in one CSV based on rows in another CSV using specific columns to compare
我有两个CSV1
文件和CSV2
CSV文件,具有多个列和行。 列之一标题为ID
。
我想要做的是检查CSV1
的行,如果有一个ID
在CSV2
的ID
列匹配CSV1
的行ID
,然后我想保持该行。 如果没有匹配项,那么我想从CSV1
删除该行。
基本上CSV1
的数据与我有关,但仅与CSV2
的人CSV2
。 两者之间的唯一连接是ID
列。 因此,我需要检查CSV1
所有行,以查看该行ID
是否在CSV2
中的一行中。
到目前为止,这就是我所拥有的。
import csv
smarteeCSV = open("Smartee.csv", "r")
aeriesCSV = open("aeriesEditable.csv", "r+")
aeries = csv.reader(aeriesCSV, delimiter=',')##CSV1
smartee = csv.reader(smarteeCSV, delimiter=',')##CSV2
for row in aeries:
for item in smartee
if row[1] != item[1]##indexes for the columns with the ids
我已经知道我走错了路,那么有人可以协助吗?
您可以提取第二个文件中的所有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]
根据您打算对相关数据行进行处理的方式,您也许可以使用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()
函数的结果。
首先,阅读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的读/写(即,第一行是列名的列表),但是如果列名也来自其他信息,则很容易进行调整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.