Фільтрування рядків

Вступ до Polars

Liam Brannigan

Data Scientist & Polars Contributor

Навіщо фільтрувати DataFrame?

rentals
shape: (49, 8)
| name      | type    | price | bedrooms | doubles | singles | review | beach |
| ---       | ---     | ---   | ---      | ---     | ---     | ---    | ---   |
| str       | str     | i64   | i64      | i64     | i64     | f64    | bool  |
|-----------|---------|-------|----------|---------|---------|--------|-------|
| Waves     | Cottage | 540   | 4        | 1       | 2       | 8.9    | false |
| Seashells | Cottage | 540   | 4        | 2       | 2       | 8.7    | true  |
| ...       | ...     | ...   | ...      | ...     | ...     | ...    | ...   |
Вступ до Polars

Знайомство з filter

rentals.filter(
  # Predicate
)
  • Предикат: оцінює умову як True або False

Зелена галочка для успішного тесту

Вступ до Polars

Знайомство з filter

rentals.filter(
  # Predicate
)
  • Предикат: оцінює умову як True або False

Зелена галочка й червоний хрестик

Вступ до Polars

Додавання предиката

rentals.filter(
    pl.col("price") < 500
)
shape: (6, 8)
| name          | type    | price | bedrooms | doubles | singles | review | beach |
| ---           | ---     | ---   | ---      | ---     | ---     | ---    | ---   |
| str           | str     | i64   | i64      | i64     | i64     | f64    | bool  |
|---------------|---------|-------|----------|---------|---------|--------|-------|
| St Ives Bay   | Hotel   | 470   | 3        | 1       | 3       | 7.7    | true  |
| Perran View   | Hotel   | 341   | 3        | 1       | 4       | 8.2    | false |
| ...           | ...     | ...   | ...      | ...     | ...     | ...    | ...   |
Вступ до Polars

Поєднання умов за AND

rentals.filter(
   # Обʼєкти до 500 біля пляжу
)
Вступ до Polars

Поєднання умов за AND

rentals.filter(
     pl.col("price") < 500
)
Вступ до Polars

Поєднання умов за AND

rentals.filter(
    (pl.col("price") < 500)
)
Вступ до Polars

Поєднання умов за AND

rentals.filter(
    (pl.col("price") < 500) &
)
Вступ до Polars

Поєднання умов за AND

rentals.filter(
    (pl.col("price") < 500) & (pl.col("beach") == True)
)
shape: (6, 8)
| name                | type    | price | ... | doubles | singles | review | beach |
| ---                 | ---     | ---   | ... | ---     | ---     | ---    | ---   |
| str                 | str     | i64   | ... | i64     | i64     | f64    | bool  |
|---------------------|---------|-------|---- |---------|---------|--------|-------|
| St Ives Bay         | Hotel   | 470   | ... | 1       | 3       | 7.7    | true  |
| Porth Retreat       | Hotel   | 249   | ... | 1       | 4       | null   | true  |
| Porth Caravan       | Caravan | 380   | ... | 1       | 4       | 7.2    | true  |
| ...                 | ...     | ...   | ... | ...     | ...     | ...    | ...   |
Вступ до Polars

Поєднання умов за OR

rentals.filter(

)
Вступ до Polars

Поєднання умов за OR

rentals.filter(
    (pl.col("price") < 500)
)
Вступ до Polars

Поєднання умов за OR

rentals.filter(
    (pl.col("price") < 500) | 
)
Вступ до Polars

Поєднання умов за OR

rentals.filter(
    (pl.col("price") < 500) | (pl.col("review") > 9.5)
)
shape: (18, 8)
| name              | type      | price | ... | doubles | singles | review | beach |
| ---               | ---       | ---   | ... | ---     | ---     | ---    | ---   |
| str               | str       | i64   | ... | i64     | i64     | f64    | bool  |
|-------------------|-----------|-------|-----|---------|---------|--------|-------|
| Bright House      | Cottage   | 956   | ... | 3       | null    | 9.9    | true  |
| Trewhiddle Villa  | Villa     | 1077  | ... | 3       | null    | 9.8    | false |
| ...               | ...       | ...   | ... | ...     | ...     | ...    | ...   |
Вступ до Polars

Фільтрування за списком

rentals.filter(
    pl.col("type").is_in(["Cottage", "Villa"])
)
shape: (34, 8)
| name          | type    | price | bedrooms | doubles | singles | review | beach |
| ---           | ---     | ---   | ---      | ---     | ---     | ---    | ---   |
| str           | str     | i64   | i64      | i64     | i64     | f64    | bool  |
|---------------|---------|-------|----------|---------|---------|--------|-------|
| Bright House  | Cottage | 956   | 4        | 3       | null    | 9.9    | true  |
| Bright House  | Cottage | 1050  | 4        | 3       | null    | 9.9    | true  |
| ...           | ...     | ...   | ...      | ...     | ...     | ...    | ...   |
Вступ до Polars

Заперечення предиката

rentals.filter(
    pl.col("type").is_in(["Cottage", "Villa"]).not_()
)
shape: (14, 8)
| name            | type      | price | ... | doubles | singles | review | beach |
| ---             | ---       | ---   | ... | ---     | ---     | ---    | ---   |
| str             | str       | i64   | ... | i64     | i64     | f64    | bool  |
|-----------------|-----------|-------| ... |---------|---------|--------|-------|
| Tregenna House  | Hotel     | 2411  | ... | 1       | 2       | 8.7    | true  |
| Tregenna House  | Hotel     | 2411  | ... | 1       | 2       | 8.7    | true  |
| ...             | ...       | ...   | ... | ...     | ...     | ...    | ...   |
Вступ до Polars

Оптимізація запитів

(
  pl.scan_csv("vacation_rentals.csv")
  .filter(pl.col("type") == "Villa")

)
Вступ до Polars

Оптимізація запитів

(
  pl.scan_csv("vacation_rentals.csv")
  .filter(pl.col("type") == "Villa")
  .explain()
)
Csv SCAN [vacation_rentals.csv]
PROJECT */8 COLUMNS
SELECTION: [(col("type")) == (String(Villa))]
Вступ до Polars

Умови фільтрації

  • pl.col("price") < 500
  • pl.col("type").is_in(["Cottage", "Villa"])
  • pl.col("bedrooms").is_between(3,4)
1 https://docs.pola.rs/api/python/stable/reference/expressions/boolean.html
Вступ до Polars

Стандартні оператори порівняння в Python

Operator Meaning
== Рівний
!= Не рівний
< Менший ніж
<= Менший або рівний
> Більший ніж
>= Більший або рівний
Вступ до Polars

Давайте потренуємось!

Вступ до Polars

Preparing Video For Download...