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

时间:2014-11-11 04:02:19

标签: 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,south africa,,new zealand

请注意,虽然“美国”在两个不同的行中重复,但它仍然保持完好,不像“中国”和“日本”,它们在同一行中重复。

我尝试以下列方式使用集合中的OrderedDict

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

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

2 个答案:

答案 0 :(得分:0)

实际上可以更具体地询问,"如何从列表中删除重复的项目。"对于哪个现有解决方案:Removing duplicates in lists

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

a,v,s,f
china,usa,china,uk,france
india,australia,usa,uk
japan,south africa,japan,new zealand

我故意改变了#34;中国和英国"在第2行到"中国,英国"。请注意以下内容。

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

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

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

答案 1 :(得分:0)

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

尝试在此类情况下使用pandas。通过选择同一行中的项目,您可以应用一个函数来重新构造关于其位置的行。我们使用in运算符来处理这种情况china and uk,并使用空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

您的代码如下:

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

要读取csv文件,只需要替换名称即可。 More details should be found here

 df= pd.read_csv("filename.csv")