Тест самоперевірки

Pandas: таблиці

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

Таблиця «дорогі» вийшла з фільтра, її індекс — 2, 3, 5, 7, а позицій у ній чотири (0-3). Що поверне дорогі.iloc[2]?

Чому так. iloc рахує позиції з нуля, тому iloc[2] — це третій рядок зверху, тобто Парк · Капучино · 270. Спокуслива відповідь «те саме, що loc» була б правильною лише на щойно прочитаній таблиці: після фільтра мітки поїхали разом із рядками, і loc[2] віддає вже інший рядок — Вокзал · Еспресо · 125. Помилки при цьому не буде в жодному випадку.
Питання 2 / 8

Що станеться, якщо написати продажі[(продажі["сума"] > 100) and (продажі["філія"] == "Вокзал")]?

Чому так. Оператор and зобовʼязаний спитати «чи лівий вираз правдивий», щоб вирішити, чи дивитись на правий. А ліворуч стоїть Series із восьми відповідей — однієї істини з неї не зробити, і pandas відмовляється вгадувати. Потрібен поелементний &, і кожна умова обовʼязково у власних дужках.
Питання 3 / 8

У стовпці «сума» два порожні значення. Скільки рядків поверне таблиця[таблиця["сума"] == np.nan]?

Чому так. NaN означає «результат невизначений», і за стандартом чисел із рухомою крапкою він не дорівнює нічому — навіть самому собі: float("nan") == float("nan") дає False. Тому маска виходить суцільно хибною, вибірка порожня, а помилки немає — це тиха пастка. Пропуски шукають методом isna().
Питання 4 / 8

Сума відома в трьох рядках із пʼяти: 75, 90 і 50. Виклик mean() дає 71.67, а dropna().mean() на тій самій таблиці — 62.50. Чому числа різні?

Чому так. mean() дірки ігнорує: (75 + 90 + 50) / 3 = 71.67. А dropna() без аргументів прибирає рядок, у якому порожня хоч одна клітинка, — разом із тим, де сума 90 була відома, а бракувало лише кількості. Лишились два рядки: (75 + 50) / 2 = 62.50. Щоб цього не сталося, вказують dropna(subset=["сума"]).
Питання 5 / 8

Що станеться з назвами філій у результаті виразу продажі.groupby("філія")["сума"].sum()?

Чому так. Ключі групування стають мітками рядків результату, тому звертатись до них треба через .loc["Вокзал"], а не через номер. Це та сама різниця loc і iloc, тільки тепер мітки — текстові. Повернути ключі назад у звичайний стовпець можна викликом .reset_index().
Питання 6 / 8

Після pd.merge(продажі, ціни, on="напій") рядків стало менше, ніж було в «продажі». Що це означає найімовірніше?

Чому так. За замовчуванням merge робить how="inner" — лишає тільки ключі, присутні в обох таблицях, і робить це без жодного попередження. Дублікати ключа дали б протилежний ефект: рядків стало б більше, бо один рядок зліва зустрів би кілька справа. Тому після кожного merge варто дивитись на shape.
Питання 7 / 8

Рядок дорогі = продажі[продажі["сума"] > 100], далі дорогі["знижка"] = дорогі["сума"] * 0.1 — і pandas видає SettingWithCopyWarning. Про що саме попередження?

Чому так. Корінь той самий, що у вигляду проти копії в NumPy: зріз буває вікном у чужу памʼять, а буває самостійною копією. Відібрані маскою рядки в памʼяті не лежать підряд, тому pandas іноді повертає одне, іноді інше — і чесно каже, що не ручається за наслідки. Лікується однозначністю: .copy() для окремої таблиці або .loc[маска, "знижка"] = … для правки оригіналу.
Питання 8 / 8

На 200 000 рядків виклик таблиця.apply(функція, axis=1) працює 1.7 с, а множення двох стовпців — 0.0006 с. Звідки різниця майже в три тисячі разів?

Чому так. apply(axis=1) — це звичайний цикл, тільки записаний коротше: на кожен рядок будується окремий обʼєкт Series і викликається твоя функція. Множення ж стовпців іде одним циклом усередині C над суцільною памʼяттю, без створення пітонівських обʼєктів. Тому якщо дію можна виразити арифметикою над стовпцями, np.where чи методами .str, — apply(axis=1) не потрібен.