Python удалить повторяющиеся строки в файле

Обновлено: 07.07.2024

Есть много способов удалить дубликаты из списка Python:

  • использование временного списка и цикла;
  • использование встроенного метода set();
  • использование ключей словаря;
  • функция List count();
  • понимание списка.

Список в Python может содержать повторяющиеся элементы. Давайте рассмотрим примеры удаления повторяющихся элементов разными способами.

1. Использование временного списка

Это метод для удаления повторяющихся элементов из списка. Мы создадим временный список и добавим в него элементы только в том случае, если его нет.

Результат: обновленный список после удаления дубликатов = [1, 2, 3, 4].

2. Функция set()

В наборе Python нет повторяющихся элементов. Мы можем использовать встроенную функцию set() для преобразования списка в набор, а затем использовать функцию list(), чтобы преобразовать его обратно в список.

3. Перечисление элементов как ключей словаря

Мы знаем, что ключи словаря уникальны. Класс dict имеет функцию fromkeys(), которая принимает итерацию для создания словаря с ключами из итерируемого.

4. Когда функция List count() – не рекомендуется

Метод list count() возвращает количество вхождений значения. Мы можем использовать его с методом remove(), чтобы убрать повторяющиеся элементы из списка.

ПРИМЕЧАНИЕ. Как указано в комментарии ниже, использование функции count() не рекомендуется при удалении элемента из того же итератора, поскольку это может привести к нежелательным результатам.

5. Понимание списка

Мы можем создать список из итерации, используя понимание списка. Этот метод аналогичен использованию временного списка и цикла for для удаления повторяющихся элементов. Но это уменьшает количество строк кода.

Лучший способ удалить дубликаты из списка

Если вам не нужны повторяющиеся элементы, вам следует использовать Set. Но если вам нужно удалить повторяющиеся значения из списка, я бы предпочел функцию count(), потому что она не создает другой временный набор или объект списка. Таким образом, он более эффективен с точки зрения памяти.

Удаление повторов
Хочу написать сразу: Встроенные функции Python использовать нельзя! С def_main и main ! Не в.

Удаление повторов в массиве Pyth0n
Дан массив a из n элементов. Удалить из этого массива все повторяющиеся элементы, оставив первые.

Удаление одинаковых строк из большого файла
Здравствуйте. Подскажите, пожалуйста, как максимально быстро удалить одинаковые строки в большом.

А что при таком наборе данных должна вывести программа? (все уникальные строки? символы? или что?)
Такая задача разбирается в книге Д.Бизли и Б.К.Джонс Python Cookbook (издание 3) в рецепте 1.10. А что при таком наборе данных должна вывести программа? (все уникальные строки?

Очевидно, что уникальные строки в новый файл.

Добавлено через 7 минут
Решение на bash:

Если хватает ОЗУ, то можно воспользоваться таким вариантом:
Добавлено через 40 минут
Хотя ОЗУ вряд ли хватит. около 20ГБ
Это был более теоретический вариант Хотя ОЗУ вряд ли хватит. около 20ГБ
Это был более теоретический вариант

Спасибо, я не совсем вас понял для обработки файла в 3гб не хватит 20гб оперативки?
так вроде файл 3гб помещается в память такого же размера, у меня на компе 8гб

Добавлено через 3 минуты

А что при таком наборе данных должна вывести программа? (все уникальные строки? символы? или что?)
Такая задача разбирается в книге Д.Бизли и Б.К.Джонс Python Cookbook (издание 3) в рецепте 1.10.

Должны остаться только уникальные строки без дублей.

11111
1111
22222
22222
33333
4

то обработанный файл будет такой

11111
1111
22222
33333
4

Добавлено через 2 минуты
да и какой вариант предложите для удаления повторов (в больших файлах)?
exe, py

так вроде файл 3гб помещается в память такого же размера

Ха, если бы. Это же питон, он на каждый чих копирует строки. Что вы хотели от интерпретируемого языка?

Если у тебя винда, поставь cygwin и:

lines_set = set()
with open(r"1.txt", "r") as fin, open(r"2.txt", "w") as fout:
* * for line in fin:
* * * * if line not in lines_set:
* * * * * * fout.write(line)
* * * * lines_set.add(line)

да и ваш код не обработал файл 1.txt с 10 строками

1111
1111
1
11
22
22
2222
5
6
7
осталось как было

cat << EOF | uniq
1212212121
567567
56756
890890890
54645646
111111
111111
111111
56756757
EOF

ну и как я по вашему смогу открыть файл 3гб чтобы вписать строки вверху и внизу, да и ставить дополнительно cygwin нет желания ради разовой операции

Добавлено через 52 секунды

он не создался, у меня питон 26

Добавлено через 3 минуты
python-2.6.4.msi

Даже у меня на продакшене 2.6.6 - то ещё старьё - новее

Конечно, что с ним сделается.

Моя программа строит множество, которое в python является хеш таблицей и занимает очень много ОЗУ. А файл читается-записывается построчно, так что почти не занимает места в ОЗУ.
Оценка 20ГБ крайне приблизительная и зависит от количества уникальных элементов.
По моим наблюдениям множество из 10^6 строк занимает 87МБ, а из 10^7 - 800МБ. Файл объёмом 3ГБ содержит около 360 млрд строк. Если они все уникальны, то множество будет иметь размер около 28ГБ, если только половина уникальна - 14ГБ, если четверть 7ГБ. Все оценки крайне неточные. Пользуйтесь ими на свой страх и риск
Также не стоит забывать, что считает она тоже не мгновенно.
В общем найдите нормальное решение, а не то, что я придумал.

PS Этот файл 2.txt (если вы не указали другого) лежит где-то в системной папке типа C:Python36

e vtyz dctuj 100 000 000 строк в этих 3 гб

Добавлено через 4 минуты
не знаю почему, но ваш скрипт у меня не работает, другие работают исправно, а ваш нет

Добавлено через 3 минуты
можно переписать чтобы удаление дублей было в исходном файле в нем удаляло дубли не создавая 2.txt
я уже в той же папке и пустой 2.txt кинул.

Добавлено через 4 минуты
наверное какой-то библиотеки не хватает, не пойму почему не работает, а другие скрипты на питоне работают в той же директории

у меня есть файл csv, из которого я хочу удалить дубликаты строк, но он слишком велик, чтобы поместиться в память. Я нашел способ сделать это, но я думаю, что это не лучший способ.

каждая строка содержит 15 полей и несколько сотен символов, и все поля, необходимые для определения уникальности. Вместо того, чтобы сравнивать всю строку, чтобы найти дубликат, я сравниваю hash(row-as-a-string) в попытке сохранить память. Я устанавливаю фильтр, который разбивает данные на примерно равное количество строк (например, дни недели), и каждый раздел достаточно мал, чтобы таблица поиска хэш-значений для этого раздела поместилась в память. Я прохожу через файл один раз для каждого раздела, проверяя уникальные строки и записывая их во второй файл (псевдокод):

один из способов ускорить это-найти лучший фильтр, чтобы уменьшить количество необходимых проходов. Предполагая, что длина строк равномерно распределена, возможно, вместо

где 'n' настолько мало, насколько позволит память. Но при этом используется тот же метод.

Уэйн Вернер предоставлено хорошее практическое решение ниже; мне было любопытно, есть ли лучший/быстрый/простой способ сделать это с точки зрения алгоритма.

P. S. Я ограничен в Python 2.5.

Если вы хотите действительно простой способ сделать это, просто создайте базу данных sqlite:

тогда вам не придется беспокоиться о какой - либо логике сравнения самостоятельно-просто позвольте sqlite позаботиться об этом за вас. Вероятно, это будет не намного быстрее, чем хеширование строк, но это, вероятно, намного проще. Конечно, вы можете изменить тип, хранящийся в базе данных, если хотите, или нет, в зависимости от случая. Конечно, поскольку вы уже конвертируете данные в строку, вы можете просто вместо этого есть одно поле. Здесь много вариантов.

вы в основном делаете сортировку слиянием и удаляете дублированные записи.

разбиение ввода на части размером с Память, сортировка каждой части, а затем слияние частей при удалении дубликатов-это здравая идея в целом.

ваш текущий метод не гарантированно работает должным образом.

во-первых, существует небольшая вероятность того, что две строки, которые на самом деле разные, могут производить одно и то же значение хэша. hash(a) == hash(b) не всегда означает a == b

во-вторых, вы делаете вероятность выше с вашим каперсом" уменьшить/лямбда":

кстати, не "".присоединиться (['foo', '1', '23']) быть несколько яснее?

BTW2, почему бы не использовать set вместо dict на htable ?

вот практическое решение: получите пакет "core utils" из GnuWin32 site и установите его. Затем:

  1. напишите копию своего файла без заголовков (скажем) infile.csv
  2. c:\gnuwin32\bin\sort --unique -ooutfile.csv infile.csv
  3. читать outfile.csv и напишите копию с добавленными заголовками

для каждого из шагов 1 и 3, можно использовать скрипт Python, или некоторые другие Gnuwin32 утилиты (голова, хвост, тройник, кошка. ).

ваше исходное решение немного неверно: у вас могут быть разные строки, хэширующие одно и то же значение (хэш-столкновение), и ваш код оставит один из них.

с точки зрения алгоритмической сложности, если вы ожидаете относительно мало дубликатов, я думаю, что самым быстрым решением было бы сканировать файл строка за строкой, добавляя хэш каждой строки (как вы это сделали), но также сохраняя местоположение этой строки. Затем, когда вы сталкиваетесь с дубликатом хэша, ищите оригинал место, чтобы убедиться, что это дубликат, а не просто хэш-коллизия, и если да, найдите назад и пропустите строку.

кстати, если значения CSV нормализованы (т. е. записи считаются равными, если соответствующие строки CSV эквивалентны байт-за-байт), вам не нужно включать синтаксический анализ CSV здесь вообще, просто иметь дело с текстовыми строками.

поскольку я предполагаю, что вам придется делать это на несколько регулярной основе (или вы взломали бы скрипт), и вы упомянули, что вас интересует теоретическое решение, вот возможность.

прочитайте входные строки В B-деревья, упорядоченные по хэш-значению каждой входной строки, записывая их на диск при заполнении памяти. Мы заботимся о том, чтобы хранить на B-деревьях исходные строки, прикрепленные к хэшу (как набор, так как мы заботимся только об уникальных линиях). Когда мы читаем дубликат элемент, мы проверяем строки, установленные на сохраненном элементе, и добавляем его, если это новая строка, которая хэшируется с тем же значением.

Почему B-Деревья? Они требуют меньше чтения диска, когда вы можете (или хотите) читать их части в память. Степень (число детей) на каждом узле зависит от доступной памяти и количество линий, но вы не хотите иметь слишком много узлов.

Как только у нас есть эти B-деревья на диске, мы сравниваем самый низкий элемент из каждого из них. Мы удаляем самый низкий из всех, из всех B-деревьев, у которых он есть. Мы объединяем их наборы строк, что означает, что у нас нет дубликатов для этих строк (а также что у нас больше нет строк, хэширующих это значение). Затем мы записываем строки из этого слияния в выходную структуру csv.

мы можем разделить половину памяти для чтения B-деревьев и половину, чтобы сохранить выходной csv в памяти в течение некоторого времени. Мы смываем csv на диск, когда его половина заполнена, добавляя к тому, что уже было написано. Сколько из каждого B-дерева, которое мы читаем на каждом шаге, можно грубо вычислить по (available_memory / 2) / number_of_btrees, округленным, чтобы мы читали полные узлы.

Как насчет использования модуля heapq для чтения фрагментов файла до предела памяти и записи их отсортированных фрагментов (heapq держит вещи всегда в отсортированном порядке).

Favorite

Добавить в избранное

Главное меню » Программирование » Python » Как удалить повторяющиеся строки в Pandas Python

Как удалить повторяющиеся строки в Pandas Python

В этой статье мы взяли набор данных, который доступен в формате файла .csv. Мы прочитаем файл .csv, чтобы показать исходное содержимое этого файла, как показано ниже:

Выявление дубликатов в Pandas Python

Необходимо определить, есть ли в используемых вами данных повторяющиеся строки. Чтобы проверить дублирование данных, вы можете использовать любой из методов, описанных в следующих разделах.

Способ 1:

Прочтите файл csv и передайте его во фрейм данных. Затем определите повторяющиеся строки с помощью функции duplicated(). Наконец, используйте оператор печати для отображения повторяющихся строк.

Способ 2:

Используя этот метод, столбец is_duplicated будет добавлен в конец таблицы и помечен как «True» в случае дублирования строк.

Удаление дубликатов в Pandas Python

Дублированные строки могут быть удалены из вашего фрейма данных, используя следующий синтаксис:

Три вышеуказанных параметра являются необязательными и более подробно описаны ниже:

  • keep: этот параметр имеет три разные значения: First, Last и False. Значение First сохраняет первое вхождение и удаляет последующие дубликаты, значение Last сохраняет только последнее вхождение и удаляет все предыдущие дубликаты, а значение False удаляет все повторяющиеся строки.
  • subset: метка, используемая для идентификации повторяющихся строк
  • inplace: содержит два условия: True и False. Этот параметр удалит повторяющиеся строки, если для него установлено значение True.

Удалите дубликаты, сохранив только первое вхождение

Когда вы используете «keep = first», будет сохранено только первое вхождение строки, а все остальные дубликаты будут удалены.

Пример

В этом примере будет сохранена только первая строка, а остальные дубликаты будут удалены:

Сохраненное вхождение первой строки выделено красным, а остальные дубликаты удалены.

Удалите дубликаты, сохранив только последнее вхождение

Когда вы используете «keep = last», все повторяющиеся строки, кроме последнего вхождения, будут удалены.

Пример

В следующем примере удаляются все повторяющиеся строки, кроме последнего вхождения.

На следующем изображении дубликаты удалены, и сохраняется только последнее вхождение строки.

Удалить все повторяющиеся строки

Чтобы удалить все повторяющиеся строки из таблицы, установите «keep = False» следующим образом:

Как вы можете видеть на следующем изображении, все дубликаты удалены из фрейма данных:

Удалить связанные дубликаты из указанного столбца

По умолчанию функция проверяет все повторяющиеся строки из всех столбцов в заданном фрейме данных. Но вы также можете указать имя столбца с помощью параметра подмножества.

Пример

В следующем примере все связанные дубли удаляются из столбца «Состояния».

Вывод

В этой статье показано, как удалить повторяющиеся строки из фрейма данных с помощью функции drop_duplicates() в Pandas Python. Вы также можете очистить свои данные от дублирования или избыточности с помощью этой функции. В статье также показано, как определять любые дубликаты во фрейме данных.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: