Удаление дубликатов в 2х файлах (Python)
Есть два файла, пусть в Эксель: old.xlsx и new.xlsx.
Выглядят одинаково. Все поля текстовые, id уникальный.
old.xlsx:
id компании Название Адрес
123 Ромашка Ленина 23
124 Лютик Свердлова 14
122 Роза Цветочная 10
new.xlsx:
id компании Название Адрес
123 Ромашка Ленина 23
124 Лютик Свердлова 14
127 Каштан Лесная 12
Требуется сверить new.xlsx с old.xlsx по id компании, так, чтобы в результате получились только новые, относительно old.xlsx, строки.
В приведённом выше примере должно остаться:
127 Каштан Лесная 12
(все остальные строки удалены,
122 Роза Цветочная 10
тоже не сохраняется, так как содержится в старом файле).
Делаю так (с использованием openpyxl):
import openpyxl
wbo = openpyxl.load_workbook('old.xlsx')
wbn = openpyxl.load_workbook('new.xlsx')
wso = wbo.active
wsn = wbn.active
row_old = wso["A"] # т.к. айдишник в столбце А
row_new = wsn["A"]
for _io in row_old:
cello = _io.value
for _in in row_new:
celln = _in.value
if cello == celln:
wsn.delete_rows(idx = _in)
wbn.save("output1.xlsx")
Вопрос1: как правильно написать синтаксис, логически вроде всё верно. Сейчас получаю ошибку:
TypeError: '>' not supported between instances of 'Cell' and 'int'
Вопрос2: так как файлы на самом деле весьма тяжелые, нет ли способа сделать то же самое с помощью pandas (она вроде по резвее будет).
Заранее благодарю.
Ответы (1 шт):
В pandas:
Ваши таблицы (загружены методом pd.read_excel()):
In[1]: old
id компании Название Адрес 0 123 Ромашка Ленина 23 1 124 Лютик Свердлова 14 2 122 Роза Цветочная 10
In[2]: new
id компании Название Адрес 0 123 Ромашка Ленина 23 1 124 Лютик Свердлова 14 2 127 Каштан Лесная 12
Заменим их индексы (когда это нужно — может быть, что вы в методе pd.read_excel() применили параметр index_col="id компании", получая тот же самый результат):
In[3]: old = old.set_index("id компании")
In[4]: new = new.set_index("id компании")
... и проверим результаты:
In[5]: old
Название Адрес id компании 123 Ромашка Ленина 23 124 Лютик Свердлова 14 122 Роза Цветочная 10
In[6]: new
Название Адрес id компании 123 Ромашка Ленина 23 124 Лютик Свердлова 14 127 Каштан Лесная 12
Сделаем математическую разность между множествами индексов и применим ею к новой таблице
In[7]: dif = new.reindex(new.index.difference(old.index))
... и проверим конечный результат:
In[8]: dif
Название Адрес id компании 127 Каштан Лесная 12
Объяснение:
In[3]: old = old.set_index("id компании")
In[4]: new = new.set_index("id компании")
Эти команды заменят индекс (имя строк) на "id компании" (вместо стандартного 0, 1, 2)
In[7]: dif = new.reindex(new.index.difference(old.index))
new.index.difference(old.index)то же самое какset(new.index) - set(old.index)есть математическая разность между множествами значений индексов новой и старой таблицы — точно то, что вы хотите:{123, 124, 127} - {123, 124, 122}есть{127}(множество всех элементов первого множества, которые не находятся во втором множестве).Метод
reindex()применит эту разность к новой таблице, устраняя таким образом все строки из старой таблицы.