Сравнение Pandas DataFrame: получение уникальных строк
Быстрый ответ
Для извлечения строк из df1
, которых нет в df2
, воспользуйтесь булевой маской с примененным к df2
методом .isin()
, который предварительно был преобразован в словарь при помощи метода to_dict('list')
. Инвертируйте результат оператором ~
, чтобы отфильтровать из df1
строки, отсутствующие в df2
.
mask = df1.isin(df2.to_dict(orient='list')).all(axis=1)
exclusive_df1 = df1[~mask]
exclusive_df1
будет содержать только те строки, которые есть в df1
, но отсутствуют в df2
. Убедитесь, что столбцы в обоих dataframe имеют один и тот же набор и порядок.
Рассмотрим разные подходы
Сравнение dataframe требует тщательного подхода к выравниванию данных, названиям столбцов и типам данных. Поэтому мы изучим несколько методов, помогающих выявлять уникальные записи.
Профессиональный уровень: использование merge
Для решения более сложных задач можно использовать метод merge
с параметром indicator
. Этот метод великолепно работает с большими наборами данных различной природы.
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 совпадают.
exclusive_df1 = df1[~df1['key_column'].isin(df2['key_column'])]
Типы данных не совпадают? Решим эту проблему!
Несоответствие типов данных в ключевых столбцах может вызывать трудности. Проверьте и при необходимости унифицируйте типы данных, приведя их к единому виду.
df1['key_column'] = df1['key_column'].astype(df2['key_column'].dtype)
Для огромных наборов данных
Если размер ваших данных близок к величине "Моби Дика":
- Используйте
set_index
для установки индексов. - Примените
MultiIndex.from_tuples
для композитных индексов.
Поддерживаем порядок
Чистота рабочего места помогает сохранить точность результатов, поэтому очищайте от временных столбцов и индексов после выполнения фильтрации.
exclusive_df1 = exclusive_df1.reset_index(drop=True)
Визуализация
Представьте, что наши два dataframe — это две пазлы:
DataFrame A (🧩): [Пазл 1, Пазл 2, Пазл 3]
DataFrame B (🧩): [Пазл 2, Пазл 3, Пазл 4]
Наша задача — найти уникальные пазлы DataFrame A
, которых нет в DataFrame B
.
🧩 A – 🧩 B: [Пазл 1]
Пазл 1 — это тот, которого нет в DataFrame B
и который мы стремимся найти.
DataFrame A (🧩): [🟢, 🟡, 🔵]
DataFrame B (🧩): [ , 🟡, 🔵]
--------------------------
Результат : [🟢]
💭 Зелёный пазл (🟢, Пазл 1) — это то, что делает "DataFrame A" непохожим на "DataFrame B".
Обращаем внимание на нюансы
Важно замечать мелкие детали и особенности, которые могут существенно влиять на итоговые данные.
Остерегайтесь клонов: дубликаты строк
Наличие в df2
полностью дублирующихся строк может искажать результат. Гарантируйте уникальность строк не только по ключевому столбцу, но и по всему их содержанию.
Осторожно, пустые значения!
Пустые значения (NaN) могут вызывать сюрпризы, меняя результаты сравнений, так как они не равны даже самим себе. Используйте pd.notna()
, чтобы корректно обработать все сравнения.
Для повышения читаемости и производительности: loc и iloc
В сложных запросах с большим объемом данных loc
и iloc
обеспечивают высокую скорость выполнения и удобство работы.
exclusive_df1 = df1.loc[~df1['key_column'].isin(df2['key_column'])]
Разгадываем загадки: мульти-индексы
В многоуровневых и сложных системах индексации оказывается полезным метод MultiIndex
.
index = pd.MultiIndex.from_tuples(df1.index.to_list())
exclusive_df1 = df1[~index.isin(df2.index)]
Он позволяет исключить строки с большей точностью.
Полезные материалы
- pandas.DataFrame.isin — документация pandas 2.2.0
- Индексация и выборка данных — документация pandas 2.2.0
- Слияние, объединение, конкатенация и сравнение — документация pandas 2.2.0
- python – удаление строк из dataframe по условию "not in" – Stack Overflow
- pandas.DataFrame.drop — документация pandas 2.2.0
- pandas.concat — документация pandas 2.2.0
- MultiIndex / продвинутая индексация — документация pandas 2.2.0