Python 从csv中查找两列的重复项
我想找到一列的重复值,并替换为csv的另一列的值,该列有多个列。首先,我将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",
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])