Отбор строк
Выбрать нужные строки — самая частая операция с таблицами: «продажи за март», «клиенты из Москвы», «товары дороже 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для поиска текста как есть.