Python 如何在csv列中查找重复项,并删除任何不符合';我没有复制品
我有一个包含如下数据的csv:Python 如何在csv列中查找重复项,并删除任何不符合';我没有复制品,python,python-3.x,csv,Python,Python 3.x,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,D
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
我想搜索最后一列(带有zipcodes的那一列),找到任何重复项,并删除在该行中没有重复项的任何行
因此,上述数据将变成:
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
class)
填充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作为文件打开(infle=open(“xy.csv”,“r”)
)并将所有行作为列表读取(lines=infle.readlines()
),即可从csv获取行列表。类似地,可以通过使用换行分隔符(outfile.write(“\n.join(outlines)
)将结果行列表作为连接字符串写入
这样的任务不需要软件包。BTW,如果您喜欢shell,您可以尝试以下命令:egrep$(rev test.csv | sort | cut-d','-f1 | uniq-d | rev | tr“\n”“|”“sed-e's/|$//g')test csv