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. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая работает с двумя таблицами — курсов и записей студентов.
- Читает из
stdinцелое числоc— количество строк таблицы курсов. - Читает следующие
cстрок; каждая содержит два токена через пробел:course_id(целое число) иtitle(строка без пробелов). Создаётpd.DataFrameс именемcoursesи столбцами'course_id','title'. - Читает целое число
r— количество строк таблицы записей. - Читает следующие
rстрок; каждая содержит два токена через пробел:course_id(целое число) иstudent(строка без пробелов). Создаётpd.DataFrameс именемregistrationsи столбцами'course_id','student'. - Шаг A. right join. Выполняет
pd.merge(courses, registrations, on='course_id', how='right'). Выводит одну строку:right shape=<shape>, затем одну строку:right nan_title=<k>— число NaN в столбце'title'результата. - Шаг 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'. - Шаг 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
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- pandas merge(how='left'): что будет без совпадения ключа
- pandas merge: validate, suffixes и MergeError — задача
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
- Загрузка CSV с явными типами и датами через readcsv — задача по NumPy и pandas
- Загрузка CSV в pandas: dtype, usecols и разбор дат
