Привет! На связи Мария Жарова, ментор курса «ML-инженер» 👋🏻
Когда только начинаешь работать с данными в Pandas, кажется, что всё сводится к
.groupby(), for-циклам и фильтрации. Но в Pandas всё решают детали. Ниже — 6 приёмов, которые делают код чище, быстрее и заметно приятнее в поддержке. Некоторые выглядят мелочами, но на длинной дистанции экономят часы.1️⃣ map() vs apply() — не одно и то же
Если работаете с одним столбцом, всегда выбирайте
map():df["gender_code"] = df["gender"].map({"male": 0, "female": 1})
df["name_len"] = df["name"].map(len)Почему это лучше, чем
apply()? Потому что map() оптимизирован именно под Series: без создания строк DataFrame и без лишних обёрток.apply() же оправдан, когда нужно работать с несколькими колонками сразу:df["full_name"] = df.apply(
lambda row: f"{row['first']} {row['last']}",
axis=1
)
2️⃣ query() — фильтрация, как в SQL
Если любите SQL, этот синтаксис зайдёт сразу:
df.query("age > 25 and city == 'Moscow'")Под капотом это то же самое, что:
df[(df["age"] > 25) & (df["city"] == "Moscow")]
По скорости почти одинаково, но читается легче и особенно спасает при большом числе условий.
3️⃣ isin() — фильтрация по списку значений
Когда нужно выбрать строки по списку категорий:
df[df["category"].isin(["books", "electronics"])]
А если нужно исключить значения:
df[~df["user_id"].isin(blacklist)]
Чище и понятнее, чем цепочки из |, & и ==.
4️⃣ assign() — аккуратные пайплайны без лишних строк
Классическая ситуация «до»:
df["total"] = df["price"] * df["quantity"]
df = df[df["total"] > 1000]
И та же логика, но «после»:
df = (
df
.assign(total=lambda x: x["price"] * x["quantity"])
.query("total > 1000")
)
Ничего не потерялось, код читается как единый поток трансформаций.
5️⃣ pipe() — когда пайплайн становится длинным
Если у вас появляются кастомные функции, но хочется сохранить цепочку:
def clean_text(df):
df["text"] = df["text"].str.lower()
return df
def add_features(df, some_param):
df["length"] = df["text"].str.len() * some_param
return df
df = (
df
.pipe(clean_text)
.pipe(add_features, some_param=10)
)
pipe() просто передаёт DataFrame первым аргументом — идеально для многошаговых преобразований.6️⃣ nlargest() и nsmallest() — топ без сортировки
Вместо:
df.sort_values("revenue", ascending=False).head(5)Проще и быстрее:
df.nlargest(5, "revenue")
А если нужен «низ» распределения:
df.nsmallest(3, "error_rate")
Меньше кода, яснее намерение + метод работает быстрее, т. к. не сортирует весь столбец.
Каждый из этих методов по отдельности выглядит как «альтернативный синтаксис». Но вместе они превращают Pandas-код из скрипта для себя в читабельный, поддерживаемый и быстрый пайплайн ⚡️
Ставьте ❤️, если было полезно — и сохраняйте, чтобы не потерять!
📊 Simulative