Сравнение Pandas DataFrame: получение уникальных строк

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для извлечения строк из df1, которых нет в df2, воспользуйтесь булевой маской с примененным к df2 методом .isin(), который предварительно был преобразован в словарь при помощи метода to_dict('list'). Инвертируйте результат оператором ~, чтобы отфильтровать из df1 строки, отсутствующие в df2.

Python
Скопировать код
mask = df1.isin(df2.to_dict(orient='list')).all(axis=1)
exclusive_df1 = df1[~mask]

exclusive_df1 будет содержать только те строки, которые есть в df1, но отсутствуют в df2. Убедитесь, что столбцы в обоих dataframe имеют один и тот же набор и порядок.

Кинга Идем в IT: пошаговый план для смены профессии

Рассмотрим разные подходы

Сравнение dataframe требует тщательного подхода к выравниванию данных, названиям столбцов и типам данных. Поэтому мы изучим несколько методов, помогающих выявлять уникальные записи.

Профессиональный уровень: использование merge

Для решения более сложных задач можно использовать метод merge с параметром indicator. Этот метод великолепно работает с большими наборами данных различной природы.

Python
Скопировать код
comparison_df = df1.merge(df2, how='left', indicator=True)
exclusive_df1 = comparison_df[comparison_df['_merge'] == 'left_only'].drop('_merge', axis=1)

Остерегайтесь дублирующихся ключей в df2, так как они могут привести к непредсказуемым результатам.

Индексы не совпадают? Без проблем!

Если индексы в двух dataframe не совпадают, примените метод isin, комбинированный с оператором негации ~, ине забывайте удостовериться, что ключевой столбец присутствует и типы данных в обоих dataframe совпадают.

Python
Скопировать код
exclusive_df1 = df1[~df1['key_column'].isin(df2['key_column'])]

Типы данных не совпадают? Решим эту проблему!

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

Python
Скопировать код
df1['key_column'] = df1['key_column'].astype(df2['key_column'].dtype)

Для огромных наборов данных

Если размер ваших данных близок к величине "Моби Дика":

  • Используйте set_index для установки индексов.
  • Примените MultiIndex.from_tuples для композитных индексов.

Поддерживаем порядок

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

Python
Скопировать код
exclusive_df1 = exclusive_df1.reset_index(drop=True)

Визуализация

Представьте, что наши два dataframe — это две пазлы:

Markdown
Скопировать код
DataFrame A (🧩): [Пазл 1, Пазл 2, Пазл 3]
DataFrame B (🧩): [Пазл 2, Пазл 3, Пазл 4]

Наша задача — найти уникальные пазлы DataFrame A, которых нет в DataFrame B.

Markdown
Скопировать код
🧩 A – 🧩 B: [Пазл 1]

Пазл 1 — это тот, которого нет в DataFrame B и который мы стремимся найти.

Markdown
Скопировать код
DataFrame A (🧩): [🟢, 🟡, 🔵]
DataFrame B (🧩): [   , 🟡, 🔵]
--------------------------
Результат     : [🟢]

💭 Зелёный пазл (🟢, Пазл 1) — это то, что делает "DataFrame A" непохожим на "DataFrame B".

Обращаем внимание на нюансы

Важно замечать мелкие детали и особенности, которые могут существенно влиять на итоговые данные.

Остерегайтесь клонов: дубликаты строк

Наличие в df2 полностью дублирующихся строк может искажать результат. Гарантируйте уникальность строк не только по ключевому столбцу, но и по всему их содержанию.

Осторожно, пустые значения!

Пустые значения (NaN) могут вызывать сюрпризы, меняя результаты сравнений, так как они не равны даже самим себе. Используйте pd.notna(), чтобы корректно обработать все сравнения.

Для повышения читаемости и производительности: loc и iloc

В сложных запросах с большим объемом данных loc и iloc обеспечивают высокую скорость выполнения и удобство работы.

Python
Скопировать код
exclusive_df1 = df1.loc[~df1['key_column'].isin(df2['key_column'])]

Разгадываем загадки: мульти-индексы

В многоуровневых и сложных системах индексации оказывается полезным метод MultiIndex.

Python
Скопировать код
index = pd.MultiIndex.from_tuples(df1.index.to_list())
exclusive_df1 = df1[~index.isin(df2.index)]

Он позволяет исключить строки с большей точностью.

Полезные материалы

  1. pandas.DataFrame.isin — документация pandas 2.2.0
  2. Индексация и выборка данных — документация pandas 2.2.0
  3. Слияние, объединение, конкатенация и сравнение — документация pandas 2.2.0
  4. python – удаление строк из dataframe по условию "not in" – Stack Overflow
  5. pandas.DataFrame.drop — документация pandas 2.2.0
  6. pandas.concat — документация pandas 2.2.0
  7. MultiIndex / продвинутая индексация — документация pandas 2.2.0