Удаление дубликатов в 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 шт):

Автор решения: MarianD

В 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() применит эту разность к новой таблице, устраняя таким образом все строки из старой таблицы.

→ Ссылка