Pandas и DataFrame: вопросы для собеседования (часть 3)

DataFrame — основная структура данных в pandas и главный инструмент аналитика для работы с табличными данными в Python. На собеседовании проверяют фильтрацию, группировку, merge, работу с пропусками и типами данных. Часто дают датасет и просят посчитать метрику прямо в коде.

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыNumPy: основыСинтаксис и типы данных

Вопросы 1115 из 20

11В `df` есть столбец `age`. Какие значения `age` попадут в результат `df[(df["age"] >= 18) & (df["age"] <= 25)]`?
AТолько 18 и 25
BТолько значения строго между 18 и 25 (19–24)
CВсе значения от 18 до 25 включительно
DВсе значения, кроме 18 и 25
Ответ: Комбинация условий через `&` дает пересечение (AND), границы `>=` и `<=` включают крайние значения.

В pandas логические операции выполняются поэлементно. Выражение `(df["age"] >= 18) & (df["age"] <= 25)` создает булеву маску, которая True только там, где оба условия выполняются одновременно. Операторы `>=` и `<=` включают 18 и 25, поэтому останутся все значения в диапазоне 18–25 включительно. Скобки важны из‑за приоритета операторов.

Подробный разбор →
12Вы хотите посчитать число уникальных пользователей по дням. Что корректно описывает результат `df.groupby("day")["user_id"].nunique()`?
A`DataFrame` со столбцами `day` и `user_id`, где значения это списки идентификаторов
B`Series` с индексом по `day` и значениями: число уникальных `user_id` в каждом дне
C`Series` с индексом по `user_id` и значениями: число дней активности по пользователю
DСкаляр: общее число уникальных пользователей по всему `df` без разбивки по датам
Ответ: `groupby(...).nunique()` возвращает `Series`: индекс — ключ группы, значения — число уникальных в каждой группе.

После `df.groupby("day")` строки разбиваются по дню. Выбор колонки `"user_id"` и вызов `.nunique()` считает число различных пользователей в каждой группе — то есть в каждом дне. Это агрегированный результат: по одной величине на группу, поэтому тип результата — `Series` с индексом `day`. Чтобы получить общий уникальный счёт без разбивки, использовали бы `df["user_id"].nunique()`.

Подробный разбор →
13Что произойдёт при `pd.merge(left, right, on="id", how="left")`, если в таблице `right` для одного `id` есть несколько строк?
A`pandas` возьмёт только первое совпадение из `right`, остальные дубли молча проигнорирует и не отразит в результате соединения
B`pandas` всегда выбросит исключение из-за неоднозначности соединения и потребует явно указать стратегию разрешения дубликатов в `right`
CСтрока из `left` с этим `id` продублируется в результате столько раз, сколько совпадений найдено в правой таблице `right`
D`pandas` автоматически усреднит числовые значения из `right` и добавит ровно одну строку в итоговый результат соединения таблиц
Ответ: При `JOIN`-ах возможна «размножающая» связь one-to-many: строки левой таблицы повторяются.

`.merge()` выполняет табличное соединение. Если ключ `id` в правой таблице не уникален, то для одной строки `left` найдётся несколько соответствий в `right`. Тогда результат будет содержать несколько строк (декартово размножение внутри ключа): одна и та же строка `left` повторится для каждого совпадения из `right`. Это важный аналитический риск, который может «раздуть» метрики.

Подробный разбор →
14Вы сделали `res = pd.merge(left, right, on="id", how="left", indicator=True)`. Как выбрать строки, для которых совпадения в `right` не нашлось?
A`res[res['_merge'] == 'both']` для оставления строк со значением `both` в индикаторе
B`res[res['_merge'] == 'right_only']` для строк, существующих только в правой таблице
C`res[res['_merge'] == 'left_only']` для строк без пары в правой таблице по ключу
D`res[res['_merge'].isna()]` для фильтрации по пропускам в столбце `_merge` индикатора
Ответ: С `indicator=True` столбец `_merge` показывает источник строки: `left_only`, `right_only` или `both`.

Параметр `indicator=True` добавляет колонку `_merge` со значениями `left_only`, `right_only` или `both` — она помогает диагностировать результат соединения. При `how="left"` строки могут быть только `left_only` (нет пары справа) или `both` (пара нашлась); `right_only` тут не встречается. Фильтр `_merge == 'left_only'` как раз и оставит строки без совпадения справа. Колонка `_merge` всегда заполнена и не содержит `NaN`.

Подробный разбор →
15Зачем часто используют `as_index=False` в выражении `df.groupby("city", as_index=False)["revenue"].sum()`?
AЧтобы `sum()` работал быстрее за счёт отказа от построения индекса по столбцу `city`
BЧтобы группировка делалась по позициям строк в таблице, а не по значениям `city`
CЧтобы автоматически удалить строки с `NaN` в столбце `revenue` перед агрегированием
DЧтобы ключ `city` остался обычным столбцом результата для удобного `.merge()` дальше
Ответ: `as_index=False` оставляет ключ группировки столбцом, а не индексом результата.

По умолчанию `.groupby()` делает ключ группировки индексом результирующей таблицы. С `as_index=False` pandas вернёт `DataFrame`, где `city` будет обычным столбцом. Это удобно в аналитических пайплайнах: такой результат проще объединять через `.merge()` по столбцу и проще читать без дополнительных `reset_index()`.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать Python в Telegram

Другие темы: Python

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыNumPy: основыСинтаксис и типы данных