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, и в данном случае решение заключается в дополнительном преобразовании типов (об этом рассказывал ранее).
Не забывайте, что у меня есть и одноименный Дзен канал, где вы можете читать статьи, подписывайтесь!