Диагностика различий в наборах данных, которая сэкономит много времени
Совершенно разные, но при этом до невозможности близкие (Эльчин Сафарли). Рассмотрим простой и эффективный способ определения различий в наборах. Сначала создадим демонстрационные датасеты:
import pandas as pd import numpy as np df1 = pd.DataFrame([[None, np.nan, 23], ['AEH', 2, 14], ['TSA', 1, 22]], columns=['fio', 'factory', 'salary']) df2 = pd.DataFrame([['TSA', 1, '22-22-22'], ['STB', 3, '88-88-88'], [None, 1, None]], columns=['fio', 'factory', 'phone']) display(df1) display(df2)
Объединим датафреймы и рассмотрим распространенный способ проверки факта отсутствия ключа в одном из наборов при внешнем соединении - пропуски по присоединяемым полям:
df = df1.merge(df2, on=['fio', 'factory'], how='outer') df[df['phone'].isna()]
Как можно заметить, такой способ нахождения различий работает не на 100%. Один из пропусков уже был во втором датасете (последний), поэтому он тоже выведен на экран. Более простым способом является использование аргумента indicator, который помечает, где присутствует ключ (в обоих либо только в одном из присоединяемых наборов):
df = df1.merge(df2, on=['fio', 'factory'], how='outer', indicator='ind') df
df['ind'].unique()
Из вывода выше видим, если ключ присутствовал только в левом наборе, он помечается индикатором 'left_only', правом - 'right_only', в обоих - 'both'.