не был слишком уверен, что все возможные случаи, судя по вопросу, к примеру, что будет представлять собой "недостающее"? Почему строки 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]
предоставит вам значение или список идентификаторов строк соответственно.
Опубликовать CSV как текст в вашем вопросе. Кроме того, [что вы пробовали до сих пор] (http://stackoverflow.com/help/how-to-ask)? – aneroid
Я нашел несколько похожих вопросов, сравнивая два csvs, но они не учитывали дубликаты. В наиболее полезном коде, который я нашел до сих пор, первый столбец в «hosts.csv» был сопоставлен с первым столбцом в «masterlist.csv», и был создан «result.csv», указав, что каждая строка в хостах была найдена где-то в главном списке. Тем не менее, мне также нужно знать, сколько раз он был найден в главном списке, поэтому я могу избавиться от каких-либо дополнительных функций или «дубликатов». Если сумма «2.75» была найдена в основной колонке 12 раз, например, она также должна быть в другом столбце 12 раз –
Я работаю с сотнями строк в каждом столбце. Я хочу сделать код, который мгновенно показывает мне, что находится в столбце1, но не в столбце2, а наоборот, и количество времени, которое они имеют в каждом столбце, важно. –