Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在csv列中查找重复项,并删除任何不符合';我没有复制品_Python_Python 3.x_Csv - Fatal编程技术网

Python 如何在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

我有一个包含如下数据的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
我想搜索最后一列(带有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