Вопросы по теме «Pandas и DataFrame»

Проверь себя · 1/3разбор после ответа
В df есть столбцы user_id и amount. Что вернёт выражение df.groupby("user_id")["amount"].sum()?

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

Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.

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

Вопросы 15 из 20

1Что вернёт выражение `df[df["price"] > 100]`?
A`DataFrame` со всеми исходными столбцами, но только из строк, где `price` больше 100
B`Series` с одним столбцом `price`, в которой остались только значения больше 100
C`DataFrame` со всеми столбцами, из которого выкинуты строки, где `price` равен ровно 100
DБулеву маску в виде `Series` той же длины, что и `df`, без выбора каких-либо строк
Ответ: Булева индексация применяет маску к `DataFrame` и возвращает только подходящие строки со всеми столбцами.

Внутреннее выражение `df["price"] > 100` формирует булеву `Series` той же длины, что и `DataFrame`. Когда вы пишете `df[маска]`, `pandas` оставляет только те строки, где маска равна `True`, а столбцы возвращает все. Это и есть булева индексация: результатом будет `DataFrame` с теми же столбцами, что были у `df`, но с отфильтрованными строками. Возвращается именно `DataFrame`, а не `Series` и не сама маска: исходный индекс строк сохраняется, если явно не вызвать `reset_index()`.

Подробный разбор →
2Какое выражение в `pandas` гарантированно вернёт объект `DataFrame` (а не `Series`) при выборе одного столбца с именем `col`?
A`df["col"]`
B`df.loc[:, "col"]`
C`df[["col"]]`
D`df.iloc[:, 0]`
Ответ: Список столбцов в двойных скобках возвращает `DataFrame`, даже если в списке всего один столбец.

В `pandas` выражения `df["col"]` и `df.loc[:, "col"]` возвращают `Series`, потому что выбирается один столбец как одномерный объект. А `df[["col"]]` передаёт список столбцов, поэтому результат — всегда `DataFrame`, что удобно для последующих `.merge()` или сохранения формы данных. Выражение `df.iloc[:, 0]` тоже даст `Series`, потому что обращается к одному столбцу по позиции.

Подробный разбор →
3Что верно про вызов `pd.merge(orders, customers, on="customer_id", how="left")`?
AОстанутся только заказы с совпадающим клиентом в `customers`, как при `inner` join
BОстанутся все строки `orders`, а поля `customers` будут `NaN` при отсутствии пары
CОстанутся все клиенты `customers`, даже без единого заказа в таблице `orders`
D`pandas` удалит дубликаты по `customer_id` в обеих таблицах перед объединением
Ответ: `left` join сохраняет все строки из левой таблицы и добавляет данные из правой по ключу.

При `how="left"` левая таблица — это `orders`, поэтому каждая строка заказа попадёт в результат. Для каждого заказа `pandas` пытается найти строку в `customers` с тем же `customer_id`. Если совпадения нет, колонки из `customers` заполняются `NaN`. Это типичный паттерн для обогащения фактов (заказов) атрибутами (клиентов). Дубликаты по ключу автоматически не удаляются — они приведут к размножению строк.

Подробный разбор →
4Что выберет фильтр `df[~df["status"].isin(["cancelled", "returned"])]`?
AТолько строки, где `df["status"]` равен `"cancelled"` или `"returned"`
BТолько строки, где `df["status"]` равен `NaN` (пропущенные значения)
CВсе строки, где `df["status"]` НЕ равен ни `"cancelled"`, ни `"returned"`
DВсе строки, где `df["status"]` НЕ равен `NaN` (без пропусков)
Ответ: `.isin()` проверяет принадлежность значения списку, а `~` инвертирует булеву маску.

Метод `df["status"].isin([...])` возвращает булеву `Series`: True для строк, где значение входит в указанный набор. Оператор `~` инвертирует маску: True становится False и наоборот. Поэтому выражение `df[~df["status"].isin([...])]` оставляет строки, где статус не равен ни одному элементу списка. Важно: `NaN` сюда не попадёт автоматически — `.isin()` для `NaN` возвращает False, а после инверсии — True.

Подробный разбор →
5Что верно про два шага: `mask = df["col"] > 0` и затем `df[mask]`?
A`mask` это булева `Series` длиной как число строк `df`; `df[mask]` это исходный `DataFrame`
B`mask` это `DataFrame` той же формы, что у `df`; `df[mask]` это одиночная `Series` из значений
C`mask` это булева `Series` по строкам `df`; `df[mask]` это `DataFrame` со строками маски `True`
D`mask` это число строк `df` со значением `True`; `df[mask]` это булева `Series` длиной как `df`
Ответ: Условие по столбцу даёт булеву `Series`, а применение маски к `DataFrame` возвращает строки, где значение `True`.

Выражение `df["col"] > 0` сравнивает значения одного столбца и возвращает булеву `Series` (один элемент на строку). Когда эту `Series` используют как индексатор `df[mask]`, pandas выбирает строки, где маска равна `True`. Так обычно строится фильтрация данных в `DataFrame` без циклов и явного перебора строк.

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

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

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

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

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

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