Spec-Zone.ru › Polars

polars.DataFrame.pivot

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

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

Доступно только в eager-режиме. См. раздел «Примеры» ниже, чтобы узнать, как выполнить «ленивое сведение», если заранее известны уникальные значения столбцов.

Изменено в версии 1.0.0: Параметр columns переименован в on.

Параметры:
on

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

on_columns

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

index

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

values

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

aggregate_function

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

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

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

sort_columns

Сортировать транспонированные столбцы по имени. По умолчанию используется порядок обнаружения.

separator

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

column_naming{‘auto’, ‘combine’}

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

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

    values columns, в противном случае использовать только имена on_columns.

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

    имена on_columns.

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

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

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

См. также

LazyFrame.pivot

Примечания

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

Примеры

Можно использовать pivot, чтобы преобразовать датафрейм из «длинного» формата в «широкий».

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

>>> 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.pivot("subject", index="name", values="test_1")
shape: (2, 3)
┌───────┬───────┬─────────┐
│ name  ┆ maths ┆ physics │
│ ---   ┆ ---   ┆ ---     │
│ str   ┆ i64   ┆ i64     │
╞═══════╪═══════╪═════════╡
│ Cady  ┆ 98    ┆ 99      │
│ Karen ┆ 61    ┆ 58      │
└───────┴───────┴─────────┘

Если нужно выполнить сведение только по ограниченному набору значений subject или значения subject уже известны заранее, их можно указать с помощью аргумента on_columns.

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

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

>>> import polars.selectors as cs
>>> df.pivot("subject", values=cs.starts_with("test"))
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:

>>> df = pl.DataFrame(
...     {
...         "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],
...     }
... )
>>> df.pivot("col", index="ix", aggregate_function="sum")
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():

>>> df = pl.DataFrame(
...     {
...         "col1": ["a", "a", "a", "b", "b", "b"],
...         "col2": ["x", "x", "x", "x", "y", "y"],
...         "col3": [6, 7, 3, 2, 5, 7],
...     }
... )
>>> df.pivot(
...     "col2",
...     index="col1",
...     values="col3",
...     aggregate_function=pl.element().tanh().mean(),
... )
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/dataframe/api/polars.DataFrame.pivot.html

Spec-Zone.ru

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