2017-01-25 5 views
0

В принципе, у нас есть эти два столбца, и мы хотим, чтобы столбец «Have» соответствовал столбцу «Should Have». Я хочу, чтобы код создавал новый столбец с дубликатами или дополнениями, которые у нас есть в «Have», а другой столбец показывает суммы, которые находятся в «Should Have», но отсутствуют в «Have».Python: как найти дубликаты из двух столбцов CSV и любые дополнительные или «отсутствующие» значения

Я не уверен, как его найти, чтобы найти дубликаты.


Файл: test.csv

+0

Опубликовать CSV как текст в вашем вопросе. Кроме того, [что вы пробовали до сих пор] (http://stackoverflow.com/help/how-to-ask)? – aneroid

+0

Я нашел несколько похожих вопросов, сравнивая два csvs, но они не учитывали дубликаты. В наиболее полезном коде, который я нашел до сих пор, первый столбец в «hosts.csv» был сопоставлен с первым столбцом в «masterlist.csv», и был создан «result.csv», указав, что каждая строка в хостах была найдена где-то в главном списке. Тем не менее, мне также нужно знать, сколько раз он был найден в главном списке, поэтому я могу избавиться от каких-либо дополнительных функций или «дубликатов». Если сумма «2.75» была найдена в основной колонке 12 раз, например, она также должна быть в другом столбце 12 раз –

+0

Я работаю с сотнями строк в каждом столбце. Я хочу сделать код, который мгновенно показывает мне, что находится в столбце1, но не в столбце2, а наоборот, и количество времени, которое они имеют в каждом столбце, важно. –

ответ

0

не был слишком уверен, что все возможные случаи, судя по вопросу, к примеру, что будет представлять собой "недостающее"? Почему строки 2, 3 и 5 не указаны, несмотря на значение «Have», не равное значению «Should Have»?

В любом случае, надеюсь, что это послужит полезным руководством. Вы можете узнать больше об обработке CSV в reference

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) позволяет легко добавить (o г создать новый список) для ключа, так что мы можем хранить несколько строк-идентификаторов для каждого значения (см this question)
  • использование iteritems() если вы используете Python 2.x и items() для Python 3.x
  • Я форматировал выходные списки с помощью (ключ, значение) кортежей. Причина в том, что я не был уверен, какие строки-иды вы хотели бы сохранить/выбросить, поэтому оставили их там! Для их индексации tupl = output_list[#] предоставит вам один кортеж, а tupl[1] или tupl[0] предоставит вам значение или список идентификаторов строк соответственно.
+0

Спасибо за вклад. Строка 2 имеет сумму 2,99 в «Have», а также 2,99 в «Should Have», чтобы эти ценности были хорошими. Они «пересекают друг друга», если хотите. То же самое для 88.74. У нас есть значение 200 дважды в столбце «У», но его только один раз в столбце «Должен иметь место», поэтому есть один дополнительный или дубликат 200.Надеюсь, что это очистит –

+0

Значения не должны быть смежными друг с другом. В столбце 1 они должны отображаться одинаково точное число раз в столбце 2! –

+0

Хорошо, понял! Отредактировано для исправления недостающих значений (используйте 'set', если вы хотите найти уникальные значения в списке). Не лично доволен решением для дубликатов, надеюсь, вы сможете найти более элегантный способ! –