Удалить дубликаты excel python
у меня есть файл 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 и установите его. Затем:
- напишите копию своего файла без заголовков (скажем) infile.csv
- c:\gnuwin32\bin\sort --unique -ooutfile.csv infile.csv
- читать 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 держит вещи всегда в отсортированном порядке).
или вы можете поймать первое слово в строке и разделить файл на куски. Затем вы можете прочитать линий (возможно сделать.join (line.split ()) для унификации интервалов / вкладок в строке, если можно изменить интервал) в наборе в алфавитном порядке очистка набора между частями (набор удаляет дубликаты), чтобы получить вещи наполовину сортировка (набор не в порядке, если вы хотите, вы можете прочитать в куче и выписать, чтобы получить сортированный порядок, последнее вхождение в набор, заменяющее старые значения, как вы идете.) В качестве альтернативы вы также можете отсортировать кусок и удалить дубликаты строк с помощью решения groupby Джо Коберга. Наконец, вы можете объединить части вместе (вы можете, конечно, сделать запись, как вы идете кусок за куском в окончательный файл во время сортировки частей)
In Excel, we can “easily” remove duplicates from a table by clicking on the “Remove Duplicates” button from the Data tab. Indeed it’s pretty easy. However, when the datasets are too big, or there are formulas in the spreadsheet, this can sometimes be slow. So today, we’ll explore how to use Python to remove duplicates from a data table. It’s super easy, fast, and flexible. Excel remove duplicates
This tutorial is part of the “Integrate Python with Excel” series, you can find the table of content here for easier navigation.
Prepare a dataframe for demo
You can download this sample Excel spreadsheet to follow along. First thing, let’s load the spreadsheet into Python. If you are not familiar with using Python to work with Excel files, check out here for a Python vs. Excel comparison.
- Line 1 and 5 contain exact same information
- Line 3 and 4 contain the same User Name, but different Country and City
Remove duplicates
Removing duplicates from the entire table
- subset : refers to column headers, use this if you want to consider only specific columns for finding duplicates, default is all columns
- keep : which duplicates to keep. ‘first’ (default): keep the first duplicate. ‘last’: keep the last duplicate. False: drop all duplicates.
- inplace : whether to overwrite the original dataframe
Now let’s check the original dataframe. It’s not changed! That’s because we left inplace argument blank, which by default is False . If we specify inplace=True , the original df will be replaced with the new dataframe with duplicates removed.
Finding unique values in a list or data table column
Sometimes we want to find unique values in a list of a dataframe column. In this case, we wouldn’t use the drop_duplicate() . I mean, we could, but there are better ways to find unique values.
pandas Series vs pandas Dataframe
For Excel users, it is easy to remember their difference. A pandas Dataframe is a table or a sheet. A pandas Series is a column in that table/sheet. In other words, a Dataframe consists of various Series.
pandas Series method .unique()
pandas Series has a .unique( ) method; however, pandas Dataframe doesn’t have this method.
When we call .unique() on a pandas Series object, it returns a list of unique elements from that column
When we call .unique() on a pandas Dataframe, we’ll get an error message because this method doesn’t exist on Dataframe!
Python set
Another way to get unique values is by using s set, a data structure in Python. A set is basically a collection of unique items. Since the set contains unique items only, those duplicates will be automatically removed if we pass duplicates into a set.
Here’s an example.
Our column (or pandas Series) contains two duplicates, “Mary Jane” and “Jean Grey”. By converting the column into a set, we are effectively removing the duplicates!
У меня есть два столбца excel, имя и компания, и я пытаюсь выяснить, как проще всего получить в качестве вывода список кортежей (имя, компания) без каких-либо дубликатов.
Следующий код кажется мне правильным, но по какой-то причине он не работает, возможно, из-за какой-то глупой ошибки, которую я не могу найти.
Я не получаю никаких ошибок, и количество контактов действительно уменьшается, но только из-за пункта u_company[x].value==None . Любая помощь или ресурс приветствуется
Если вы уже используете pandas, может быть проще загрузить лист Excel в фрейм данных, удалить дубликаты и сохранить его снова. Все это должно быть не более 3 строк
Если вы не используете pandas и хотели бы придерживаться своего подхода: важен ли порядок?
Если нет, то загрузите все имена и компании в список; теперь этот вопрос не отличается от любого другого вопроса на SO о том, как удалить дубликаты из списка.
Не думал об использовании панд, на самом деле это выглядит намного проще, и я попробую сейчас, между тем мне все еще очень любопытно, почему это не сработает . Большое спасибо за подсказку!
Для такого рода вещей pandas не будет быстрее, но это все еще очень полезная библиотека.
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ.
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это.
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и.
Ответы 2
Условие, при котором вы пытаетесь игнорировать дубликаты, неверно.
Вы добавляете в список пары (u_names[x].value, u_company[x].value) . Это нормально и имеет смысл. Проблема в том, что вы проверяете, есть ли (u_names[x].value, u_names[x].value) уже в списке.
Кроме того, даже если это было то же самое, вы просто ничего не делаете, когда находите дубликат. Ваш оператор else после for будет выполняться всегда! Это связано с тем, что оператор else после цикла for происходит, когда цикл завершается без попадания оператора break . Итак, что вы хотите сделать, это:
Я пытаюсь удалить повторяющиеся/повторяющиеся имена, которые появляются в столбце NAME. Я просто хочу сохранить 1-е вхождение из повторяющихся/повторяющихся имен с помощью скрипта Python.
Это мой ввод excel:
И нужен вывод следующим образом:
Почему вы хотите сделать это в пандах? твой лист большой? Если он не такой большой, вы можете легко сделать это с помощью формул Excel (например, поместить IF(A2=A1;"":A2) в столбец за вашими данными, скопировать формулу вниз, затем скопировать весь столбец и вставить значения, рассчитанные по формуле, в столбец A. Вы можете записать эту процедуру как макрос, поэтому вы можете повторно выполнить ее в любое время.
Мои данные очень большие. Это не так уж и мало, и я хочу использовать скрипт Python для слияния с другими кодами или вещами. @jottbe
Понимаю. Один только размер не будет проблемой. Я имею в виду, что вы получаете свои данные на листе Excel, поэтому вы можете обрабатывать их там, но если вы все равно делаете другие вещи с Excel, используя python, это точка.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 1
Это не удаление дубликатов, скажем, вы просто заполняете повторяющиеся ключи в одном столбце как пробелы, я бы обработал это следующим образом:
создав маску, в которой вы возвращаете логическое значение true/false, если строка == строка выше.
предполагая, что ваш фрейм данных называется df
то, что мы делаем выше, это следующее,
сначала выбрав один столбец или, в терминологии панд, серию, затем мы применяем .ne (не равно), который на самом деле равен !=
давайте посмотрим это в действии.
теперь давайте создадим фрейм данных, похожий на ваш.
Итак, если бы мы сделали df['NAME'].ne('Omar') , то же самое, что и [df['NAME'] != 'Omar'] , мы бы получили.
Итак, с учетом этого, мы хотим увидеть, соответствует ли имя в строке 1 (помните, что python — это язык с нулевым индексом, поэтому строка 1 на самом деле является второй физической строкой) .eq строке выше.
мы делаем это, вызывая [.shift][2] гиперссылку для получения дополнительной информации.
что это в основном делает, так это сдвигает строки по их индексу с определенным номером переменной, давайте назовем это n.
если бы мы позвонили df['NAME'].shift(1)
мы можем видеть здесь, что Рекха опустилась
Итак, сложив все это вместе,
мы назначаем это самоопределяемой переменной с именем mask , вы можете называть это как хотите.
затем мы используем [.loc][2] , который позволяет вам получить доступ к вашему фрейму данных по меткам или логическому массиву, в данном случае массиву.
однако мы хотим получить доступ только к логическим значениям, которые имеют значение False, поэтому мы используем ~ , который инвертирует логику нашего массива.
все, что нам нужно сделать сейчас, это изменить эти строки на пустые в соответствии с вашим первоначальным требованием, и у нас осталось.
надеюсь, это поможет!
классно. это работает. не могли бы вы объяснить это вкратце.. что означает .ne, .loc, ~mask.
@srish сделаю, как только буду дома! Спасибо за зеленую галочку.
@srish отредактировал для вас, надеюсь, это поможет. Удачного кодирования!
Это действительно очень хорошее объяснение. Большое спасибо за ваше время и это объяснение, оно мне очень помогло. Если это в моей руке, я, должно быть, поставил вам более одной зеленой галочки и плюсов :-) :-D
добро пожаловать, и не волнуйтесь, я многому научился, прочитав документы, чтобы ответить. Удачи, и убедитесь, что вы предоставили текстовый фрейм данных (например, тот, который я дал выше), если вы зададите другой вопрос.
да, я не забуду использовать текстовый фрейм данных, когда задам другой вопрос. Спасибо:-)
In the article, Python scripts to format data in Microsoft Excel, we used Python scripts for creating an excel and do various data formatting. Python is an interesting high-level programming language. You can go through various use cases of Python on SQLShack.
In this article, we will look at removing duplicate data from excel using the Python.
A quick recap of removing duplicate rows in Microsoft Excel
Suppose we have the following data in an excel sheet. We want to get rid of duplicate values in this sheet.
In Microsoft Excel, we use the Remove Duplicates button from the Data menu. This option checks duplicate values and retains the FIRST unique value and removes other values.
Let’s click on Remove Duplicates and select all columns.
Click ok, and it removes the duplicate values 3 duplicate values and retains 5 unique values.
We have the following data after removing duplicates from this.
Suppose you are working in excel using Python language. If that excel contains duplicate values, we might not want to use Excel functionalities for it. Our script should be capable of handling such duplicate data and remove per our requirements such as remove all duplicates, remove all but the last duplicate, remove all but first duplicate.
Let’s look at the Python way of handling duplicate data in excel.
Python scripts for removing duplicates in an excel
Before we start with Python, make sure you run through the pre-requisites specified in the article, Python scripts to format data in Microsoft Excel.
Launch SQL Notebook in Azure Data Studio and verify pandas, NumPy packages existence. You can click on Manage Extensions in Azure Data Studio for it.
Once you click on Manage Packages, it gives you a list of installed packages. Here, we can see both pandas and NumPy package along with pip utility.
We use the pandas read_excel() function to import an excel file. Create a new code block in SQL Notebook and execute the code. Here, the print statement prints the data frame that consists of excel sheet data.
First, we import the pandas library to read and write the excel sheets.
In this data, few columns contain NaN in the remarks column. Python display NaN for the cells that do not have any value/text.
Читайте также: