</>
Topic 3 of 7

Course materials are currently available in Russian only.

Отбор строк

Выбрать нужные строки — самая частая операция с таблицами: «продажи за март», «клиенты из Москвы», «товары дороже 1000 рублей». В pandas это делается теми же масками, что и в numpy, только по столбцам с именами.

Условие по столбцу

import pandas as pd

df = pd.DataFrame({
    "товар": ["чай", "кофе", "сахар", "мёд"],
    "цена": [250, 640, 90, 480],
    "склад": ["A", "B", "A", "B"],
})

mask = df["цена"] > 300
print(df[mask])
  товар  цена склад
1  кофе   640     B
3   мёд   480     B

df["цена"] > 300 — это Series из True/False. Подставленная в квадратные скобки, она оставляет только строки с True. Индекс строк при этом сохраняется (здесь 1 и 3).

Несколько условий

Как и в numpy: & — и, | — или, ~ — не, каждое условие в скобках:

cheap_a = df[(df["цена"] < 300) & (df["склад"] == "A")]
not_b = df[~(df["склад"] == "B")]

Удобные готовые условия:

df[df["цена"].between(100, 500)]          # от 100 до 500 включительно
df[df["товар"].isin(["чай", "мёд"])]      # значение из списка

loc — строки и столбцы сразу

loc[строки, столбцы] позволяет одновременно отобрать строки (маской или подписями) и столбцы (списком имён):

print(df.loc[df["цена"] > 300, ["товар", "цена"]])
print(df.loc[1, "товар"])               # кофе — по подписи строки

iloc[строки, столбцы] — то же, но по номерам позиций:

print(df.iloc[0:2, 0])                  # первые две строки, первый столбец

Через loc с маской можно и изменять значения:

df.loc[df["склад"] == "B", "цена"] = df["цена"] * 0.9   # скидка на складе B

Строковые условия

У столбцов со строками есть набор методов в .str:

names = pd.Series(["Анна", "антон", "Борис"])
print(names.str.lower())                     # все в нижнем регистре
print(names.str.startswith("А"))             # начинается с «А»
print(names.str.contains("ан", case=False))  # содержит «ан» без учёта регистра
print(names.str.len())                       # длина каждой строки

У contains по умолчанию включены регулярные выражения: точки, скобки и звёздочки в образце имеют особый смысл. Чтобы искать образец как обычный текст, добавляй regex=False.

Пустой результат

Если ни одна строка не подошла, получится пустая таблица: len(result) == 0 или result.empty == True. Проверяй это, если в задаче для такого случая нужен особый ответ.

query — условие строкой

Для сложных условий есть сокращённая запись:

df.query("цена > 300 and склад == 'B'")

Внутри query можно писать and, or, not. Это удобно читать, но опечатки в строке ловятся только при выполнении.

Итог

  • df[маска] — строки, где условие истинно; индекс сохраняется;
  • условия соединяются &, |, ~, каждое — в скобках;
  • between, isin — диапазон и список значений;
  • loc[строки, столбцы] — по подписям и маскам, iloc — по позициям; через loc можно присваивать;
  • .str.contains, .str.lower, .str.startswith — условия на строки, regex=False для поиска текста как есть.