Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何从两个CSV列以及任何额外的或';缺失';价值观_Python_Csv_Compare - Fatal编程技术网

Python:如何从两个CSV列以及任何额外的或';缺失';价值观

Python:如何从两个CSV列以及任何额外的或';缺失';价值观,python,csv,compare,Python,Csv,Compare,基本上,我们有这两个列,我们想让'have'列与'Should have'列匹配。我希望代码创建一个新列,显示“have”中的重复项或额外项,另一列显示“Should have”中的金额,但“have”中缺少 我不知道怎样才能找到重复的 文件:test.csv 不太确定所有可能的案例都是从这个问题判断出来的,例如,什么将构成“缺失”?尽管“Have”值不等于“Should Have”值,为什么第2、3和5行没有列出 无论如何,希望这能成为一个有用的指南。您可以在中阅读有关CSV处理的更多信息

基本上,我们有这两个列,我们想让'have'列与'Should have'列匹配。我希望代码创建一个新列,显示“have”中的重复项或额外项,另一列显示“Should have”中的金额,但“have”中缺少

我不知道怎样才能找到重复的


文件:test.csv


不太确定所有可能的案例都是从这个问题判断出来的,例如,什么将构成“缺失”?尽管“Have”值不等于“Should Have”值,为什么第2、3和5行没有列出

无论如何,希望这能成为一个有用的指南。您可以在中阅读有关CSV处理的更多信息

文件:

输出:

>> 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(请参阅)
  • 如果您使用的是Python2.x和Python3.x的
    items()
    ,请使用
    items()
  • 我用(键,值)元组格式化了输出列表。原因是我不确定您要保留/丢弃哪些行ID,所以将它们都放在那里!为它们编制索引
    tupl=output\u list[#]
    将为您提供一个元组,
    tupl[1]
    tupl[0]
    将分别为您提供行ID的值或列表

在问题中以文本形式发布CSV。此外,我还发现了一些类似的问题,这些问题比较了两个CSV,但它们没有说明重复。在迄今为止我发现的最有用的代码中,“hosts.csv”中的第一列与“masterlist.csv”中的第一列进行了比较,并创建了一个“results.csv”,说明主机中的每一行是否在masterlist中的某个位置找到。然而,我还需要知道它在masterlist中被发现了多少次,这样我就可以去掉任何多余的,或“重复的”。例如,如果金额“2.75”在主列中被发现12次,那么它也应该在另一列中被发现12次。我正在处理每列中的数百行。我想编写一段代码,立即向我显示第1列中的内容,而不是第2列中的内容,反之亦然,它们在每列中的时间长短非常重要感谢您的贡献。第2行的“Have”中的金额为2.99,而“Should Have”中的金额为2.99,因此这些值是好的。如果你愿意的话,他们会“互相划掉”。88.74年代也是如此。我们在have列中有两次值200,但在Should have列中只有一次,因此有一个额外的值,或者说是重复的200。希望这能澄清问题。这些值不必彼此相邻。它们只需要在第1列中显示与第2列相同的确切次数!好的,明白了!编辑以修复缺少的值(如果要在列表中查找唯一值,请使用
set
)。我个人不喜欢重复的解决方案,希望你能找到一个更优雅的方式!很抱歉,您只能相互减去集合。修正。谢谢你的帮助,我会努力使它更优雅,我还在这个项目的早期阶段,我想投入更多的时间。另外,我是python新手,所以我感谢所有的帮助。
~$ 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])]