🔥
Polars: шпаргалка Polars ≠ Pandas. Это
колоночный движок, вдохновлённый Rust и SQL. Никаких
SettingWithCopyWarning — всё иммутабельно и параллелится.
🚀 Быстрый старт
import polars as pl
df = pl.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"score": [95, 85, 100]
})
📊 Выборка и фильтрация
df.filter(pl.col("score") > 90)
df.select(pl.col("name").str.lengths())
df[df["id"] == 2]
• Комбинированные условия:
df.filter((pl.col("score") > 80) & (pl.col("name").str.contains("A")))
---
## ⚙️ Трансформации
• Вычисление новых колонок:
df.with_columns([
(pl.col("score") / 100).alias("percent"),
pl.col("name").str.to_uppercase().alias("name_upper")
])
• Удаление/переименование:
df.drop("id").rename({"name": "username"})
•
apply() — только если
нельзя обойтись иначе:
df.with_columns(
pl.col("score").map_elements(lambda x: x * 2).alias("doubled")
)
🧠 Группировка и агрегаты
df.groupby("name").agg([
pl.col("score").mean().alias("avg_score"),
pl.count()
])
• Агрегация с кастомной функцией:
df.groupby("name").agg(
(pl.col("score") ** 2).mean().sqrt().alias("rms")
)
---
## 🪄 Ленивая обработка (LazyFrame)
lf = df.lazy()
result = (
lf
.filter(pl.col("score") > 90)
.with_columns(pl.col("score").log().alias("log_score"))
.sort("log_score", descending=True)
.collect()
)
✅ Всё оптимизируется *до выполнения* — pushdown, predicate folding, projection pruning.
🔥
Joins
df1.join(df2, on="id", how="inner")
Варианты:
"inner",
"left",
"outer",
"cross",
"semi",
"anti" 📂 Работа с файлами
pl.read_csv("data.csv")
df.write_parquet("out.parquet")
pl.read_json("file.json", json_lines=True)
Ленивая загрузка:
pl.read_parquet("big.parquet", use_pyarrow=True).lazy()
---
## 🧮 Аналитика и окна
df.with_columns([
pl.col("score").rank("dense").over("group").alias("rank"),
pl.col("score").mean().over("group").alias("group_avg")
])
🧱 Структуры, списки, explode
df = pl.DataFrame({
"id": [1, 2],
"tags": [["a", "b"], ["c"]]
})
df.explode("tags")
• Работа с вложенными списками:
df.select(pl.col("tags").list.lengths())
🧪 Полезные фичи• Проверка типов:
df.schema
df.dtypes
• Проверка на null:
df.filter(pl.col("score").is_null())
• Заполнение:
df.fill_null("forward")
• Выбор n лучших:
df.sort("score", descending=True).head(5)
📦 Советы и best practices• Используй
lazy() для производительности.
• Избегай
.apply() — если можешь, используй
pl.col().map_elements() или векторные выражения.
• Сохраняй
schema — удобно при пайплайнах данных.
•
@pl.api.register_expr_namespace("yourns") — добавляй кастомные методы как namespace.
✅
Polars: минимализм, скорость, безопасность.