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 появятся суффиксы.

  1. Читает из stdin целое число w — количество строк таблицы склада.
  2. Читает следующие w строк; каждая содержит три токена через пробел: item_id (целое число), stock (целое число), rating (вещественное число). Создаёт pd.DataFrame с именем warehouse и столбцами 'item_id', 'stock', 'rating'.
  3. Читает целое число s — количество строк таблицы поставщика.
  4. Читает следующие s строк; каждая содержит три токена через пробел: item_id (целое число), supply (целое число), rating (вещественное число). Создаёт pd.DataFrame с именем supplier и столбцами 'item_id', 'supply', 'rating'.
  5. Шаг 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)
РешениеPython

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

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

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