polars.LazyFrame.pivot
-
Создаёт сводную таблицу в стиле электронной таблицы в виде 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 │ └──────┴──────────┴──────────┘
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
© 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