Python 从csv中查找两列的重复项

Python 从csv中查找两列的重复项,python,csv,python-2.7,Python,Csv,Python 2.7,我想找到一列的重复值,并替换为csv的另一列的值,该列有多个列。首先,我将csv中的两列放入字典。然后,我想找到字典中具有字符串值和键的重复值。我尝试了删除字典副本的解决方案,但得到的错误是不可哈希或没有结果。这是代码的第一部分 import csv from collections import defaultdict import itertools as it mydict = {} index = 0 reader = csv.reader(open(r"computing.csv",

我想找到一列的重复值,并替换为csv的另一列的值,该列有多个列。首先,我将csv中的两列放入字典。然后,我想找到字典中具有字符串值和键的重复值。我尝试了删除字典副本的解决方案,但得到的错误是不可哈希或没有结果。这是代码的第一部分

import csv
from collections import defaultdict
import itertools as it

mydict = {}
index = 0
reader = csv.reader(open(r"computing.csv", "rb"))
for i, rows in enumerate(reader):
    if i == 0: 
    continue

    if len(rows) == 0:
        continue
    k = rows[3].strip()      
    v = rows[2].strip()    
    if k in mydict:        
        mydict[k].append(v)
    else:
        mydict[k] = [v]

#mydict = hash(frozenset(mydict))

print mydict

d = {}
while True:
    try:        
        d = defaultdict(list)
        for k,v in mydict.iteritems():
            #d[frozenset(mydict.items())]
            d[v].append(k)
    except:
        continue

writer = csv.writer(open(r"OLD.csv", 'wb'))
for key, value in d.items():
    writer.writerow([key, value])

你的问题不清楚。所以我希望我做对了

请给出输入列和所需输出列的示例。 请提供错误的打印输出,并让我们知道是哪一行导致了错误

如果
column1=[1,2,3,1,4]
column2=[a,b,c,d,e]
您希望输出是
n\u column1=[a,2,3,d,4]
column2=[1,b,c,d,e]

我想异常出现在
d[v].append(k)
中,因为v显然是一个列表。不能将列表用作字典中的键

In [1]: x = [1,2,3,1,4]

In [2]: y = ['a','b','c','d','e']

In [5]: from collections import defaultdict

In [6]: d = defaultdict(int)

In [7]: for a in x:
   ...:     d[a] += 1


In [8]: d
Out[8]: defaultdict(<type 'int'>, {1: 2, 2: 1, 3: 1, 4: 1})

In [9]: x2 = []

In [10]: for a,b in zip(x,y):
   ....:     x2.append(a if d[a]==1 else b)
   ....:     

In [11]: x
Out[11]: [1, 2, 3, 1, 4]

In [12]: x2
Out[12]: ['a', 2, 3, 'd', 4]

当我运行代码时,我得到了“TypeError:unhasable type:list”。这就是你得到的错误吗?你的问题很难理解。您表示希望“查找一列的重复值,并替换为csv另一列的值”。这句话的结构让读者觉得你想用整列替换一列中的重复值。这毫无意义。你能澄清一下吗?@Rawrgulmuffins我也收到了错误“TypeError:unhasable type:list.”。请看我的其他评论。输入是输入csv中的两列,输出是最终csv中的一列。对于重复的情况,我的想法是使用字典。如何使用dictionary获得所需的结果?@nater抱歉,我不想用整列替换一列中的重复值。csv有行和列。如果C580与C980相同,我想将它们替换为E580和E980,以及相应的行。如果不是,则仅使用“C”列单元格值。但最终的输出是只使用列“C”的唯一值的一列。这有意义吗?请用您的输入和所需输出的示例更新问题。感谢您用示例说明问题。这个例子适用于第一部分。csv中列“C”的输入行类似于[a1、b1、c1、a1、e1,…],列“E”类似于[m6、g2、t4、d1、u3,…]。实际上,这两列是输入csv中的唯一键。我的目标是最终csv中的输出列是使用两列输入csv中的一列,例如列“B”,如[m6,b1,c1,d1,e1,…]。但是如果我只使用列“C”值,有些是重复的。因此我的想法是在重复的位置使用列“e”。我想从csv中提取这两列,并将它们放入键和值的字典中,这样我就可以找到字典中重复的值,如果重复,受尊重的值将替换为字典中唯一的键。如果不重复,则使用这些值。最后,我想把csv和字典一起写进一列和其他输入csv的列中。我编辑了答案以反映您的代码,并对其进行了修改,使其能够正常工作。为什么使用defaultdict(int)?这两列都是字符串。因为直方图dict是频率计数器。要检测哪些项目重复多次。。。
import csv
from collections import defaultdict
import itertools as it

mydict = {}
index = 0
reader = csv.reader(open(r"computing.csv", "rb"))
histogram = defaultdict(int)
k = []
v = []
for i, rows in enumerate(reader):
    if i == 0: 
        continue

    if len(rows) == 0:
        continue
    k.append(rows[3].strip())
    v.append(rows[2].strip())

    item = k[-1]
    histogram[item] += 1

output_column = []

for first_item, second_item in zip(k,v):
    output_column.append(first_item if histogram[first_item]==1 else second_item)

writer = csv.writer(open(r"OLD.csv", 'wb'))
for c1, c2 in zip(output_column, v):
    writer.writerow([c1, c2])