Таблиця «дорогі» вийшла з фільтра, її індекс — 2, 3, 5, 7, а позицій у ній чотири (0-3). Що поверне дорогі.iloc[2]?
iloc рахує позиції з нуля, тому iloc[2] — це третій рядок зверху, тобто Парк · Капучино · 270. Спокуслива відповідь «те саме, що loc» була б правильною лише на щойно прочитаній таблиці: після фільтра мітки поїхали разом із рядками, і loc[2] віддає вже інший рядок — Вокзал · Еспресо · 125. Помилки при цьому не буде в жодному випадку.Що станеться, якщо написати продажі[(продажі["сума"] > 100) and (продажі["філія"] == "Вокзал")]?
and зобовʼязаний спитати «чи лівий вираз правдивий», щоб вирішити, чи дивитись на правий. А ліворуч стоїть Series із восьми відповідей — однієї істини з неї не зробити, і pandas відмовляється вгадувати. Потрібен поелементний &, і кожна умова обовʼязково у власних дужках.У стовпці «сума» два порожні значення. Скільки рядків поверне таблиця[таблиця["сума"] == np.nan]?
NaN означає «результат невизначений», і за стандартом чисел із рухомою крапкою він не дорівнює нічому — навіть самому собі: float("nan") == float("nan") дає False. Тому маска виходить суцільно хибною, вибірка порожня, а помилки немає — це тиха пастка. Пропуски шукають методом isna().Сума відома в трьох рядках із пʼяти: 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=["сума"]).Що станеться з назвами філій у результаті виразу продажі.groupby("філія")["сума"].sum()?
.loc["Вокзал"], а не через номер. Це та сама різниця loc і iloc, тільки тепер мітки — текстові. Повернути ключі назад у звичайний стовпець можна викликом .reset_index().Після pd.merge(продажі, ціни, on="напій") рядків стало менше, ніж було в «продажі». Що це означає найімовірніше?
merge робить how="inner" — лишає тільки ключі, присутні в обох таблицях, і робить це без жодного попередження. Дублікати ключа дали б протилежний ефект: рядків стало б більше, бо один рядок зліва зустрів би кілька справа. Тому після кожного merge варто дивитись на shape.Рядок дорогі = продажі[продажі["сума"] > 100], далі дорогі["знижка"] = дорогі["сума"] * 0.1 — і pandas видає SettingWithCopyWarning. Про що саме попередження?
.copy() для окремої таблиці або .loc[маска, "знижка"] = … для правки оригіналу.На 200 000 рядків виклик таблиця.apply(функція, axis=1) працює 1.7 с, а множення двох стовпців — 0.0006 с. Звідки різниця майже в три тисячі разів?
apply(axis=1) — це звичайний цикл, тільки записаний коротше: на кожен рядок будується окремий обʼєкт Series і викликається твоя функція. Множення ж стовпців іде одним циклом усередині C над суцільною памʼяттю, без створення пітонівських обʼєктів. Тому якщо дію можна виразити арифметикою над стовпцями, np.where чи методами .str, — apply(axis=1) не потрібен.