Pandas и DataFrame: вопросы для собеседования (часть 2)
DataFrame — основная структура данных в pandas и главный инструмент аналитика для работы с табличными данными в Python. На собеседовании проверяют фильтрацию, группировку, merge, работу с пропусками и типами данных. Часто дают датасет и просят посчитать метрику прямо в коде.
Вопросы 6–10 из 20
6В `df` есть столбцы `user_id` и `amount`. Что вернёт выражение `df.groupby("user_id")["amount"].sum()`?
A`DataFrame` с двумя столбцами: `user_id` и `amount`
B`Series`, где индекс — `user_id`, а значения — сумма `amount` по каждому пользователю
CСкаляр: общую сумму `amount` по всей таблице
D`DataFrame` с MultiIndex по строкам и столбцам
Ответ: Выбор одного столбца после `.groupby()` обычно ведёт к `Series` после агрегации.
Конструкция `df.groupby("user_id")["amount"]` выбирает колонку `amount` внутри групп и возвращает объект, который при агрегации (`sum()`) дает `Series`. Индексом этой `Series` будут значения ключа группировки (`user_id`), а значениями — суммы `amount` внутри каждой группы. Если нужен именно `DataFrame`, часто добавляют `reset_index()`.
7Что вернёт `df.mean(numeric_only=True)` для числовых столбцов в `DataFrame` `df`?
AОдин скаляр: среднее по всем числам во всей таблице
B`DataFrame` с таким же числом строк, как у `df`
CСписок средних значений без названий столбцов
D`Series`, где индекс — имена числовых столбцов, а значения — их средние
Ответ: Многие агрегаты по умолчанию считаются по столбцам и возвращают `Series` по колонкам.
Вызов `df.mean(...)` агрегирует данные по оси столбцов (то есть считает среднее значение в каждом столбце отдельно). Поэтому результат — `Series`: у нее индексом выступают названия числовых колонок, а значениями — рассчитанные средние. Это полезно, когда нужно быстро получить «профиль» числовых признаков.
8В чём смысл параметров в `pd.merge(df_left, df_right, left_on="sku", right_on="product_sku", how="inner")`?
APandas будет искать совпадения по двум столбцам одновременно: `sku` и `product_sku` в обеих таблицах
BОбъединение будет выполнено по индексам `df_left` и `df_right`
CБудут использованы только значения `df_left["sku"]`, а `df_right` просто добавится по порядку строк
DСтроки будут сопоставляться по равенству `df_left["sku"]` и `df_right["product_sku"]`
Ответ: `left_on`/`right_on` нужны, когда названия ключевых столбцов различаются.
Параметры `left_on` и `right_on` явно задают, какие колонки сравнивать для построения соответствий между строками. В примере ключ в левой таблице называется `sku`, а в правой — `product_sku`. `how="inner"` означает, что в результат попадут только пары строк, где ключи совпали.
9У вас есть `s = df.groupby("user_id").size()`. Что нужно сделать, чтобы получить `DataFrame` с колонками `user_id` и `cnt` для дальнейшего `.merge()`?
AСделать `s.reset_index(name="cnt")`
BСделать `s.to_list()`
CСделать `s.values`
DСделать `s.astype(float)`
Ответ: `.size()` возвращает `Series`, а `reset_index(...)` превращает агрегат в табличный `DataFrame`.
После `.groupby(...).size()` вы получаете `Series`, где индекс — ключ группировки (`user_id`), а значения — количество строк в группе. Для объединений через `.merge()` чаще удобнее иметь явный столбец с ключом, поэтому применяют `reset_index(name="cnt")`. Это превратит индекс в колонку `user_id` и создаст колонку `cnt` со счетчиками.
10В `DataFrame` `df` есть столбцы `country`, `user_id`, `revenue`. Что вернёт выражение `df.loc[df["country"] == "RU", ["user_id", "revenue"]]`?
A`Series` со значениями `revenue` только для страны RU
B`DataFrame` со строками, где `country == "RU"`, и только столбцами `user_id` и `revenue`
CБулеву маску (тип `Series`) для столбца `country`
D`DataFrame` со всеми строками, но с `NaN` в `revenue` для стран не RU
Ответ: `.loc` позволяет одновременно выбрать строки по условию и нужные столбцы, возвращая `DataFrame`.
В `df.loc[строки, столбцы]` первый аргумент отвечает за выбор строк, второй — за выбор столбцов. Условие `df["country"] == "RU"` дает булеву `Series`, которая фильтрует строки. Список столбцов `["user_id", "revenue"]` ограничивает набор колонок, поэтому результатом будет `DataFrame`, а не `Series`.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram