pandas merge indicator: outer join и несовпавшие ключи

merge(..., indicator=True) добавляет в pandas столбец _merge: left_only, right_only или both. Он показывает, в какой таблице найден ключ, и помогает проверять несовпавшие строки.

Тип соединения определяет, какие строки останутся

how="outer" сохраняет ключи обеих таблиц; how="right" — все ключи правой таблицы. У отсутствующей пары значения полей другой стороны становятся пропусками. Сначала решите, какая сторона должна сохраняться целиком.

При повторных ключах merge может увеличить число строк: для каждого ключа образуются сочетания совпадающих строк. indicator этого не запрещает. Если ожидаете уникальность, задайте подходящий validate, например one_to_one или many_to_one.

Пример на других данных

import pandas as pd
left = pd.DataFrame({"id": [1, 2], "name": ["A", "B"]})
right = pd.DataFrame({"id": [2, 3], "score": [8, 9]})
audit = left.merge(right, on="id", how="outer", indicator=True,
                   validate="one_to_one").sort_values("id")
print(audit["_merge"].tolist())

Результат:

['left_only', 'both', 'right_only']

Попробуйте сами

Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.

Right join и outer с indicator: диагностика несовпавших строк

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая работает с двумя таблицами — курсов и записей студентов.

  1. Читает из stdin целое число c — количество строк таблицы курсов.
  2. Читает следующие c строк; каждая содержит два токена через пробел: course_id (целое число) и title (строка без пробелов). Создаёт pd.DataFrame с именем courses и столбцами 'course_id', 'title'.
  3. Читает целое число r — количество строк таблицы записей.
  4. Читает следующие r строк; каждая содержит два токена через пробел: course_id (целое число) и student (строка без пробелов). Создаёт pd.DataFrame с именем registrations и столбцами 'course_id', 'student'.
  5. Шаг A. right join. Выполняет pd.merge(courses, registrations, on='course_id', how='right'). Выводит одну строку: right shape=<shape>, затем одну строку: right nan_title=<k> — число NaN в столбце 'title' результата.
  6. Шаг B. outer join с indicator. Выполняет pd.merge(courses, registrations, on='course_id', how='outer', indicator=True). Выводит одну строку: outer both=<a> left_only=<b> right_only=<c> — число строк с каждым значением '_merge'.
  7. Шаг C. NaN по оси right. В результате outer join из шага B подсчитывает число NaN в столбце 'student' и выводит одну строку: outer nan_student=<k>.

Ввод и вывод

Программа читает stdin и пишет в stdout.

Ограничения: c >= 1, r >= 1.

Формат ввода

c
course_id title
...
r
course_id student
...

Формат вывода

Ровно четыре строки в порядке шагов A–C:

right shape=(<rows>, <cols>)
right nan_title=<k>
outer both=<a> left_only=<b> right_only=<c>
outer nan_student=<k>

Пример

Ввод
4
10 Python
20 SQL
30 Excel
40 Scala
5
10 Аня
10 Боря
20 Вера
50 Гена
50 Дина
Вывод
right shape=(5, 3)
right nan_title=2
outer both=3 left_only=2 right_only=2
outer nan_student=2
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи