polars.DataFrame.pivot
-
Создаёт сводную таблицу в стиле электронной таблицы в виде 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’: значение по умолчанию; если столбцов несколько, объединить их имена с помощью разделителя,
-
valuescolumns, в противном случае использовать только именаon_columns.
-
-
‘combine’: Always combine the values columns’ names with -
имена
on_columns.
-
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без объявления таких изменений нарушающими обратную совместимость.
-
- Возвращает:
-
- DataFrame
См. также
Примечания
В некоторых других фреймворках эта операция может быть известна как
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 │ └──────┴──────────┴──────────┘
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
© 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