如何在 csv 列中查找重复项,并删除任何没有重复项的行



我有一个csv,其中的数据如下:

777 Brockton Avenue,Abington,MA,2351
30 Memorial Drive,Avon,MA,2322
250 Hartford Avenue,Bellingham,MA,2351
700 Oak Street,Brockton,MA,2301
66-4 Parkhurst Rd,Chelmsford,MA,1824
591 Memorial Dr,Chicopee,MA,2351
55 Brooksby Village Way,Danvers,MA,2301

我想搜索最后一列(有邮政编码的那一列(,找到任何重复项,并删除在该行中没有重复项的任何行。

所以上面的数据会变成:

777 Brockton Avenue,Abington,MA,2351
250 Hartford Avenue,Bellingham,MA,2351
700 Oak Street,Brockton,MA,2301
591 Memorial Dr,Chicopee,MA,2351
55 Brooksby Village Way,Danvers,MA,2301

我试过使用熊猫和很多其他方法,但我在做这件事时仍然遇到了很多麻烦。有人知道我该怎么做吗?

您可以使用dict按邮政编码对行进行索引。collections.defaultdict很好,因为每当发现新的邮政编码时,您不必专门创建列表。在这种情况下,defaultdict将使用您赋予它的初始值设定项(在本例中为list类(。

一旦你填充了dict,它的值是按邮政编码分组的列表,任何列表>1符合您的标准。

import csv
import collections
zip_index = collections.defaultdict(list)
with open('test.csv', newline='') as fileobj:
reader = csv.reader(fileobj)
for row in reader:
zip_index[row[-1]].append(row)
with open('output.csv', 'w', newline='') as fileobj:
writer = csv.writer(fileobj)
for rows in zip_index.values():
if len(rows) > 1:
writer.writerows(rows)

如果你只是把它作为一个文本文件,就像在最初的文章中一样,你可以只拆分每一行并使用最后一个元素。使用字典来跟踪每个邮政编码的重复次数,然后在所有行中循环第二次,只保留那些有邮政编码的行,这些行会出现多次:

lines = ["777 Brockton Avenue,Abington,MA,2351",
"30 Memorial Drive,Avon,MA,2322",
"250 Hartford Avenue,Bellingham,MA,2351",
"700 Oak Street,Brockton,MA,2301",
"66-4 Parkhurst Rd,Chelmsford,MA,1824",
"591 Memorial Dr,Chicopee,MA,2351",
"55 Brooksby Village Way,Danvers,MA,2301"]
## Get an overview of duplicates
zipdir = {}
for l in lines:
try:
zipdir[l.split(",")[-1]] +=1
except:
zipdir[l.split(",")[-1]] = 1
## Retain the ones with more than one occurrence
outlines = []
for l in lines:
if zipdir[l.split(",")[-1]]>1:
outlines.append(l)

在您的情况下,这将从数据中删除两个元素。行列表可以通过将csv作为文件打开(infile = open("xy.csv","r")(并将所有行作为列表读取(lines = infile.readlines()(来从csv获得。类似地,所得到的行列表可以通过将它们作为具有换行分隔符(outfile.write("n".join(outlines)(的连接字符串来写入。

这样的任务不需要任何程序包。

最新更新