从CSV中删除重复的条目

时间:2017-04-12 21:25:12

标签: python csv

我有一个包含2列的csv:

a,x
a,y
a,z
b,1
b,2
b,3
b,4
c,5
c,6
c,7
c,8

我想循环查看第1列,并且只显示第一列中每个值的2个条目。我不关心第二列保留或删除的值,我只想要第一列的每个不同选项的2个条目。

输出看起来像这样:

a,x
a,y
b,1
b,2
c,5
c,6

我熟悉csv模块(如何读/写/替换),但我很难找到解释如何将一行与另一行进行比较的资源。我认为这就是我遇到这个问题的地方。

3 个答案:

答案 0 :(得分:0)

我会使用字典来解决这个问题,可能是以下几点:

dict = {}

rows = [['a', 'x'], ['a', 'y'], ['a', 'z'], ['b', 1], ['b', 2], ['b', 3], ['b', 4], ['c', 5], ['c', 6], ['c', 7], ['c', 8]]

for row in rows:
    if row[0] not in dict.keys():
        dict[row[0]] = []

    if len(dict[row[0]]) == 2:
        continue

    dict[row[0]].append(row[1])

print(dict)

输出:

>> {'a': ['x', 'y'], 'b': [1, 2], 'c': [5, 6]}

答案 1 :(得分:0)

所以,这是一个基于雅各布的想法:

创建两个词组,firstsecond

对于CSV中的每一行:

  • 如果密钥位于second,请跳过,否则
  • 如果密钥不在first放在那里
  • 如果密钥位于first,且该值不是您要去的行,请将密钥添加到second

最后,您可以根据需要使用两个带有值的词典 您可以通过创建字典列表来概括它以保持N值,并使用您需要的数量

答案 2 :(得分:0)

以下是itertools.groupby

的示例
import itertools
with open("test.csv", "r") as stuff:
    data = stuff.readlines()


out = []
for k,dat in itertools.groupby(data, key=lambda x: x[0]):
    twoVals = list(dat)[:2]
    out.append(twoVals)

print out

对于少于两个值的情况

import itertools
with open("test.csv", "r") as stuff:
    data = stuff.readlines()


out = []
for k,dat in itertools.groupby(data, key=lambda x: x[0]):
    dat = list(dat)
    try:    
        vals = dat[:2]
    except IndexError:
        vals = list(dat)
    out.append(vals)

print out

我测试了这个:

a,x
a,y
a,z
b,1
b,2
b,3
b,4
c,5
c,6
c,7
c,8
z,1