Spec-Zone.ru › Polars

polars.LazyFrame.pivot

LazyFrame.pivot(
    on: ColumnNameOrSelector | Sequence[ColumnNameOrSelector],
    on_columns: Sequence[Any] | Series | DataFrame,
    *,
    index: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None,
    values: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None,
    aggregate_function: PivotAgg | Expr | None = None,
    maintain_order: bool = False,
    separator: str = '_',
    column_naming: Literal['auto',
    'combine'] = 'auto',
) → LazyFrame

Создаёт сводную таблицу в стиле электронной таблицы в виде DataFrame.

движок:В памятиЧастично потоковая обработка
Параметры:
on

Столбец (или столбцы), значения которых будут использованы в качестве новых столбцов выходного DataFrame.

on_columns

Какие комбинации значений будут учитываться в выходной таблице.

index

Столбец (или столбцы), которые сохраняются при преобразовании входных данных в выходные. В выходном DataFrame будет по одной строке для каждой уникальной комбинации значений index. Если указано None, будут использованы все оставшиеся столбцы, не указанные в on и values. Необходимо указать хотя бы один из параметров index и values.

values

Существующий столбец (или столбцы) со значениями, которые будут перенесены в новые столбцы из index. Если задана функция агрегации, она будет вычисляться для этих значений. Если указано None, будут использованы все оставшиеся столбцы, не указанные в on и index. Необходимо указать хотя бы один из параметров index и values.

aggregate_function

Выберите один из вариантов:

  • None: агрегация не выполняется; если в группе несколько значений, будет вызвана ошибка.
  • Строка с названием предопределённой функции агрегации: одна из {‘min’, ‘max’, ‘first’, ‘last’, ‘sum’, ‘mean’, ‘median’, ‘len’, ‘item’}
  • Выражение для выполнения агрегации. Выражение может обращаться только к данным соответствующих столбцов ‘values’, созданных функцией pivot, через pl.element().
maintain_order

Гарантирует сортировку значений index в порядке их обнаружения.

separator

Используется в качестве разделителя в именах создаваемых столбцов, если столбцов values несколько.

column_naming{‘auto’, ‘combine’}

Способ формирования имён результирующих столбцов.

  • ‘auto’: значение по умолчанию; объединяет имена с разделителем, если их несколько

    столбцов values; в противном случае используются только имена on_columns.

  • ‘combine’: Always combine the values columns’ names with

    имена on_columns.

Предупреждение

Эта функциональность считается нестабильной. Она может измениться в любой момент, и такие изменения не будут считаться нарушающими обратную совместимость.

Возвращает:
DataFrame

Примечания

В некоторых других средах эту операцию могут называть pivot_wider.

Примеры

С помощью pivot можно преобразовать DataFrame из «длинного» формата в «широкий».

Например, представим, что у нас есть DataFrame с результатами тестов некоторых учеников, где каждая строка соответствует отдельному тесту.

>>> df = pl.DataFrame(
...     {
...         "name": ["Cady", "Cady", "Karen", "Karen"],
...         "subject": ["maths", "physics", "maths", "physics"],
...         "test_1": [98, 99, 61, 58],
...         "test_2": [100, 100, 60, 60],
...     }
... )
>>> df
shape: (4, 4)
┌───────┬─────────┬────────┬────────┐
│ name  ┆ subject ┆ test_1 ┆ test_2 │
│ ---   ┆ ---     ┆ ---    ┆ ---    │
│ str   ┆ str     ┆ i64    ┆ i64    │
╞═══════╪═════════╪════════╪════════╡
│ Cady  ┆ maths   ┆ 98     ┆ 100    │
│ Cady  ┆ physics ┆ 99     ┆ 100    │
│ Karen ┆ maths   ┆ 61     ┆ 60     │
│ Karen ┆ physics ┆ 58     ┆ 60     │
└───────┴─────────┴────────┴────────┘

С помощью pivot можно преобразовать данные так, чтобы для каждого ученика была одна строка, предметы стали отдельными столбцами, а результаты тестов test_1 — значениями:

>>> df.lazy().pivot(
...     "subject",
...     on_columns=["maths", "physics"],
...     index="name",
...     values="test_1",
... ).collect()  
shape: (2, 3)
┌───────┬───────┬─────────┐
│ name  ┆ maths ┆ physics │
│ ---   ┆ ---   ┆ ---     │
│ str   ┆ i64   ┆ i64     │
╞═══════╪═══════╪═════════╡
│ Cady  ┆ 98    ┆ 99      │
│ Karen ┆ 61    ┆ 58      │
└───────┴───────┴─────────┘

Можно также использовать селекторы — здесь мы включаем в сводную таблицу результаты всех тестов:

>>> import polars.selectors as cs
>>> df.lazy().pivot(
...     "subject",
...     on_columns=["maths", "physics"],
...     values=cs.starts_with("test"),
... ).collect()  
shape: (2, 5)
┌───────┬──────────────┬────────────────┬──────────────┬────────────────┐
│ name  ┆ test_1_maths ┆ test_1_physics ┆ test_2_maths ┆ test_2_physics │
│ ---   ┆ ---          ┆ ---            ┆ ---          ┆ ---            │
│ str   ┆ i64          ┆ i64            ┆ i64          ┆ i64            │
╞═══════╪══════════════╪════════════════╪══════════════╪════════════════╡
│ Cady  ┆ 98           ┆ 99             ┆ 100          ┆ 100            │
│ Karen ┆ 61           ┆ 58             ┆ 60           ┆ 60             │
└───────┴──────────────┴────────────────┴──────────────┴────────────────┘

Если в ячейке окажется несколько значений, можно указать способ их агрегации с помощью aggregate_function:

>>> lf = pl.LazyFrame(
...     {
...         "ix": [1, 1, 2, 2, 1, 2],
...         "col": ["a", "a", "a", "a", "b", "b"],
...         "foo": [0, 1, 2, 2, 7, 1],
...         "bar": [0, 2, 0, 0, 9, 4],
...     }
... )
>>> lf.pivot(
...     "col", on_columns=["a", "b"], index="ix", aggregate_function="sum"
... ).collect()  
shape: (2, 5)
┌─────┬───────┬───────┬───────┬───────┐
│ ix  ┆ foo_a ┆ foo_b ┆ bar_a ┆ bar_b │
│ --- ┆ ---   ┆ ---   ┆ ---   ┆ ---   │
│ i64 ┆ i64   ┆ i64   ┆ i64   ┆ i64   │
╞═════╪═══════╪═══════╪═══════╪═══════╡
│ 1   ┆ 1     ┆ 7     ┆ 2     ┆ 9     │
│ 2   ┆ 4     ┆ 1     ┆ 0     ┆ 4     │
└─────┴───────┴───────┴───────┴───────┘

Пользовательскую функцию агрегации также можно передать с помощью polars.element():

>>> lf = pl.LazyFrame(
...     {
...         "col1": ["a", "a", "a", "b", "b", "b"],
...         "col2": ["x", "x", "x", "x", "y", "y"],
...         "col3": [6, 7, 3, 2, 5, 7],
...     }
... )
>>> lf.pivot(
...     "col2",
...     on_columns=["x", "y"],
...     index="col1",
...     values="col3",
...     aggregate_function=pl.element().tanh().mean(),
... ).collect()  
shape: (2, 3)
┌──────┬──────────┬──────────┐
│ col1 ┆ x        ┆ y        │
│ ---  ┆ ---      ┆ ---      │
│ str  ┆ f64      ┆ f64      │
╞══════╪══════════╪══════════╡
│ a    ┆ 0.998347 ┆ null     │
│ b    ┆ 0.964028 ┆ 0.999954 │
└──────┴──────────┴──────────┘

© 2020 Ritchie Vink
© 2022 Polars contributors
Licensed under the MIT License.
https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.pivot.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API