如何从csv列中的相同字符串中删除重复的单词

时间:2013-07-11 23:58:12

标签: python python-2.7

我有一个csv文件,由于连接(该部分不在我的控制范围内),在同一个单元格中有许多重复的单词。这通常发生在同一列中。这是一个像我一样的例子:

Name,Geo Location,Default
DRE EXT EXT Pair Video,,
DRE United Kingdom EXT LON Extrane lo.EXT LON RD01,United Kingdom,
DRE United Kingdom EXT LON Extrane lo.EXT LON RD02,United Kingdom,
DRE United Kingdom LON lab dyna test LON,United Kingdom,
DRE United StatesCPT Corp Point Link_Pair Video DRE,United States,
DRE United Kingdom SDD SASD-D TRAIL01 to RD01,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL01 to RD02 SASD-D,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL02 to RD01,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL02 to RD02,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL01 to TRAIL02,United Kingdom,
DRE United Kingdom SDD SASD-D RD01 to RD02,United Kingdom,
DRE United States MDR SASD-D XC SASD-D Xplay to SASD-D,United States,
DRE Hong Kong (China) Hongkong  HKOuter RD01 HKInter,"Hong Kong, Hong Kong",
DRE United Kingdom DRE LON Sq lab dynam test,United Kingdom,
DRE United States USTHA SPS Thalberg usthamd mdf01,United States,
DRE Hong Kong (China)DRE SASD-D Hong Kong Citi SASD-D EXT,Hong Kong,
SASD-D United States SASD-D USPHXCAP VRF SASD-D USPHXCAP RD02,United States,

我需要删除重复的单词,但只能在同一个单元格中删除。

我已经开始使用下面的代码,该代码基于类似主题的许多其他问题/答案。我的代码不起作用,我不知道如何使其工作或者是否有另一种更好的方法。

from csv import DictReader, DictWriter

with open('file1.csv') as fi1,\
     open('file2.csv', 'wb') as fout1:

    read1 = DictReader(fi1)

    write1 = DictWriter(fout1, fieldnames=read1.fieldnames)
    write1.writeheader()



    for line1 in read1:
        col=line1['Name']
        outline = dict(line1)
        ' '.join(set(col.split()))
        write1.writerow(outline)

我需要帮助完成这项工作或使用其他方法来使其工作。我在想是否有一种方法来清除行之间的集合,它可能会起作用。

谢谢, B0T

2 个答案:

答案 0 :(得分:1)

这个问题:

' '.join(set(col.split()))

...是你计算结果,但不是用它做任何事情。如果要将line1['Name']替换为结果,则必须执行以下操作:

outline1['Name'] = ' '.join(set(col.split()))

同时,set以任意顺序返回值。所以,一旦你解决了这个问题,你最终会随机乱搜这些词。更糟糕的是,它可能出现在您的系统上使用小集合按预期工作,但随后在较大的集合或其他计算机上失败...

您可以使用collections文档中链接的OrderedSet食谱。

但是,还有另一种看似更干净的选择:来自itertools recipesunique_everseen功能。


虽然我们在这里,但我不明白为什么你在做outline = dict(line1),当line1已经是一个词典时,你不需要两个单独的副本(通常,你我希望这样你可以修改一个而不影响其他的,但这不是问题。

所以:

for line1 in read1:
    line1['Name'] = ' '.join(unique_everseen(line1['Name'].split()))
    write1.writerow(line1)

最后:

  

我在想是否有一种方法来清除行间的集合,它可能会有用。

您已经为每一行创建了一个新集,因此无需清除。

答案 1 :(得分:0)

看起来你想要删除包含大写字母的重复项,这些重复项也可能包含数字或连字符,所以可能类似于:

s = 'SASD-D United States SASD-D USPHXCAP VRF SASD-D USPHXCAP RD02'

import re
print re.sub(r'(\b[-A-Z0-9]{2,}\b)', lambda L, seen=set(): '' if L.group(1) in seen or seen.add(L.group(1)) else L.group(1), s)
# SASD-D United States  USPHXCAP VRF   RD02