pandas merge: validate, suffixes и MergeError — задача
pd.merge соединяет таблицы по ключам. Параметр validate проверяет ожидаемую кардинальность: например, one_to_one требует уникальных ключей в обеих таблицах, а one_to_many — уникальных ключей в левой таблице.
Если слева по одному заказу на ключ, а справа несколько строк с деталями этого заказа, проверка one_to_one не соответствует данным и может привести к MergeError. Параметр suffixes решает отдельную проблему: различает одноимённые столбцы, которые не являются ключами соединения.
В задаче ниже сравните варианты соединения и обработайте ожидаемую ошибку проверки ключей. Точные требования к столбцам и выводу указаны в условии; код проверяется в браузере.
Суффиксы и validate: merge двух таблиц с общим столбцом-не-ключом
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая работает с двумя таблицами: складом (warehouse) и поставщиком (supplier). Обе таблицы содержат столбец rating (помимо ключа), поэтому при merge появятся суффиксы.
- Читает из
stdinцелое числоw— количество строк таблицы склада. - Читает следующие
wстрок; каждая содержит три токена через пробел:item_id(целое число),stock(целое число),rating(вещественное число). Создаётpd.DataFrameс именемwarehouseи столбцами'item_id','stock','rating'. - Читает целое число
s— количество строк таблицы поставщика. - Читает следующие
sстрок; каждая содержит три токена через пробел:item_id(целое число),supply(целое число),rating(вещественное число). Создаётpd.DataFrameс именемsupplierи столбцами'item_id','supply','rating'. - Шаг A. outer join с явными суффиксами. Выполняет:
merged = pd.merge(warehouse, supplier, on='item_id', how='outer',
suffixes=('_wh', '_sup'))
Выводит одну строку: cols=<список имён столбцов> — list(merged.columns) как строку Python.
Затем выводит: nan_supply=<k> — число NaN в столбце 'supply'.
Затем выводит: nan_rating_sup=<k> — число NaN в столбце 'rating_sup'.
6. Шаг B. validate='one_to_one' — ожидаемая ошибка. Выполняет merge с теми же параметрами плюс validate='one_to_one' внутри try/except и при поимке pd.errors.MergeError выводит строку: validate=error.
7. Шаг C. validate='one_to_many' — успешное соединение. Выполняет inner join тех же таблиц с validate='one_to_many' и suffixes=('_wh', '_sup'). Выводит одну строку: validate=ok shape=<shape>.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Ограничения: w >= 1, s >= 1.
Формат ввода
w item_id stock rating ... s item_id supply rating ...
Гарантируется:
- ключ
item_idуникален в таблицеwarehouse(one side); - в таблице
supplierхотя бы одинitem_idвстречается более одного раза (many side), поэтомуvalidate='one_to_one'обязан выброситьMergeError; - хотя бы один
item_idизwarehouseотсутствует вsupplier(порождает NaN вsupplyиrating_supпри outer join); - хотя бы один
item_idизsupplierотсутствует вwarehouse(порождает NaN вstockиrating_wh).
Формат вывода
Ровно пять строк:
cols=<list>
nan_supply=<k>
nan_rating_sup=<k>
validate=error
validate=ok shape=(<r>, <c>)
Пример
- Ввод
3 1 100 4.5 2 200 3.8 3 150 4.0 4 1 50 4.2 2 80 3.5 2 60 3.9 5 90 4.7
- Вывод
cols=['item_id', 'stock', 'rating_wh', 'supply', 'rating_sup'] nan_supply=1 nan_rating_sup=1 validate=error validate=ok shape=(3, 5)
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- pandas merge(how='left'): что будет без совпадения ключа
- pandas merge indicator: outer join и несовпавшие ключи
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
- Загрузка CSV с явными типами и датами через readcsv — задача по NumPy и pandas
- Загрузка CSV в pandas: dtype, usecols и разбор дат
