使用Python从csv文件的行中删除重复项

使用Python从csv文件的行中删除重复项,python,csv,repeat,duplicate-removal,Python,Csv,Repeat,Duplicate Removal,我是Python新手,正在尝试执行以下操作。 我有一个csv文件,如下所示,input.csv a,v,s,f china,usa,china and uk,france india,australia,usa,uk japan,south africa,japan,new zealand 在这里,我想删除每一行的重复项,以获得下面的结果 a,v,s,f (output.csv) china,usa, and uk,france india,australia,usa,uk japan,sou

我是Python新手,正在尝试执行以下操作。 我有一个csv文件,如下所示,input.csv

a,v,s,f
china,usa,china and uk,france
india,australia,usa,uk
japan,south africa,japan,new zealand
在这里,我想删除每一行的重复项,以获得下面的结果

a,v,s,f (output.csv)
china,usa, and uk,france
india,australia,usa,uk
japan,south africa,,new zealand
请注意,虽然“usa”在两行中重复,但它仍然保持不变,不像“china”和“japan”在同一行中重复

我试着用以下方式使用OrderedDict

from collections import OrderedDict
out = open ("output.csv","w")
items = open("input.csv").readlines()
print >> out, list(OrderedDict.fromkeys(items))

但它将所有数据移动到一行

实际上可以更具体地问,如何从列表中删除重复项。有一个现有的解决方案:

因此,假设您的CSV文件如下所示: items.csv

我故意将第2行中的中国和英国更改为中国,英国。注如下

然后,删除重复项的脚本可以是:

import sys
with open('items.csv', 'r') as csv:
    for line in csv.readlines():
        print list(set(line.split(',')))

注意:现在,如果第二个确实包含中国和英国,那么您必须做一些不同于将文件作为CSV处理的事情。

我们可能会在迭代行和删除项目时损坏数据集,而不考虑相关的原始位置。每个项目都有相关的索引列/行,删除它可以将下一个项目移动到其他位置

尝试在这种情况下使用。通过选择同一行中的项目,可以应用函数根据其位置重新构造行。我们使用in运算符来处理中国和英国的此类场景,并用空str替换重复的值

 def trans(x):
        d=[y for y in x]
        i=0
        while i<len(d):
            j=i+1
            item=d[i]
            while j<len(d):
                if item in d[j]: 
                    d[j]=d[j].replace(item,'')
                j+=1
            i+=1
        return d

readlines将在不带参数的情况下读取文件中的所有行。可能应该使用readline,而不是一次只读一行,并对每一行执行该操作,直到完成为止。@JamesH感谢您的回复。对每一行执行此操作直到完成,您的意思是我应该为每一行手动重新运行脚本吗?请看ray.dino的答案。这是一个很好的解决方案,它实际上可以很好地处理readlines,但逻辑上与我得到的是一样的。好的干净Python ey解决方案在以下情况下可能会遇到问题:中国、美国、中国和英国、法国+当您使用set时,r减少位置。这意味着你要将它们移动到不同的列,以使最后一列成为emty。
 def trans(x):
        d=[y for y in x]
        i=0
        while i<len(d):
            j=i+1
            item=d[i]
            while j<len(d):
                if item in d[j]: 
                    d[j]=d[j].replace(item,'')
                j+=1
            i+=1
        return d
import pandas as pd
from io import StringIO


data="""a,v,s,f
china,usa,china and uk,france
india,australia,usa,uk
japan,south africa,japan,new zealand"""
df= pd.read_csv(StringIO(data.decode('UTF-8')) )


from collections import Counter
def trans(x):
    d=[y for y in x]
    i=0
    while i<len(d):
        j=i+1
        item=d[i]
        while j<len(d):
            if item in d[j]: 
                d[j]=d[j].replace(item,'')
            j+=1
        i+=1
    return d

print df.apply(lambda x:trans(x),axis=1 )


       a             v        s            f
0  china           usa   and uk       france
1  india     australia      usa           uk
2  japan  south africa           new zealand
 df= pd.read_csv("filename.csv")