March 28, 2021

2 эффективных приема для нахождения несовпадений в данных

Эти действия помогут локализовать ошибку и понять, как ее исправить. Запоминайте и применяйте в схожих ситуациях.

Пусть в нашем распоряжении имеются две таблицы (data и df), которые должны быть практически идентичными (только значения перемешаны), однако в коде ведут себя, будто это не так:

Как обычно, будем использовать Python и библиотеку Pandas .

Получение несоответствующих значений

Для этого потребуется воспользоваться методом isin объекта Series или DataFrame, а именно вывести столбец (в данном случае - индекс_города), значения которого присутствуют в одной таблице и отсутствуют в другой:

df.loc[~df['индекс_города'].
      isin(data['индекс_города']),'индекс_города']

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

df.loc[~df['индекс_города'].
      isin(data['индекс_города']),'индекс_города'].\
        value_counts()

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

d1 = df.apply(lambda x:tuple(x),axis=1)
d2 = data.apply(lambda x:tuple(x),axis=1)
d2[~d2.isin(d1)]

Не забываем, что аналогичные действия можно предпринимать симметрично для другой таблицы.

Попарно вывести несовпадения

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

fio_i1 = df.loc[(~df['индекс_города'].
      isin(data['индекс_города'])) & (df['ФИО'].isin(data['ФИО'])),['ФИО','индекс_города']]
fio_i2 = data.loc[(~data['индекс_города'].
      isin(df['индекс_города'])) & (data['ФИО'].isin(df['ФИО'])),['ФИО','индекс_города']]
      df_m = pd.merge(fio_i1,fio_i2,on='ФИО')      

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

Не забывайте, что у меня есть и одноименный Дзен канал, где вы можете читать статьи, подписывайтесь!