Python:如何从两个CSV列中找到重复项,以及任何额外的或“缺失”的列。值

时间:2017-01-25 02:10:54

标签: python csv compare

基本上我们有这两个专栏,我们希望得到' Have'匹配'应该有'的列柱。我希望代码能够创建一个新列,显示我们所拥有的重复项或附加内容' Have'另一栏显示“应该有”的数量。但是缺少了'有'

我不确定如何让它发现重复。

文件:test.csv

1 个答案:

答案 0 :(得分:0)

还不确定所有可能的案例是从这个问题判断出来的,例如什么将构成"缺失"?为什么没有列出第2,3和5行,尽管"有"价值不等于"应该有"值?

无论如何,希望这是一个有用的指南。您可以在reference

中详细了解CSV处理
import csv

with open("test.csv", 'r') as fd:
    csv_reader = csv.reader(fd)

    #Skip the header
    next(csv_reader, None)

    #init arrays
    have, should_have = {}, {}

    row_counter = 0
    for row in csv_reader:

        have.setdefault(float(row[0]),[]).append(row_counter)

        try:
            should_have.setdefault(float(row[1]),[]).append(row_counter)
        except IndexError:
            continue

        row_counter += 1

extras = [(k,v) for k, v in have.items() if k not in should_have]

have_excess = []
for k, v in have.items():
    if ((k,v) not in extras) and (len(v) > 1):

        if (len(v) > len(should_have[k])):
            have_excess.append((k,v))

missing = []
for k, v in should_have.items():

    if k not in have:
        missing.append((k,v))
    elif (len(v) > len(have[k])):
        missing.append((k,v))

文件:

~$ cat test.csv
    have  , should-have
    200   , 88.74
    42.5  , 42.5
    2.99  , 88.74
    88.74 , 2.99
    200   , 200
    200   , 8.7
    8.7   , 9.99
    1000  , 200
    200
    88.74
    2000, 88.74

输出:

>> print(extras)
# [(2000.0, [8]), (1000.0, [7])]

>> print(missing)
# [(88.74, [0, 2, 8]), (9.99, [6])]

>> print(duplicates)
# [(200.0, [0, 4, 5, 8])]

一些注意事项:

  • dict.setdefault(key,[]).append(value)方法允许我们轻松地向键添加(或创建新列表),以便我们可以为每个值存储多个行ID(请参阅this question
  • 如果你正在使用Python 2.x而使用iteritems(),而使用items()来使用Python 3.x
  • 我使用(键,值)元组格式化输出列表。原因是我不确定你想保留/丢弃哪些行ID,所以将它们留在那里!要为它们编制索引tupl = output_list[#]将为您提供一个元组,tupl[1]tupl[0]将分别为您提供行ID的值或列表。