DataFrame.pivot()
Метод pivot() преобразует DataFrame из «длинного» формата в «широкий»: уникальные значения одного столбца становятся новыми столбцами, другого — индексом, а третьего — заполняют ячейки. Операция, обратная melt().
Примечание
pivot() требует уникальных комбинаций index + columns. Если дубликаты есть, используйте pivot_table() с агрегацией.
Сигнатура
DataFrame.pivot(*, columns, index=None, values=None)
Параметры
columns— столбец, чьи уникальные значения станут именами новых столбцов.index— столбец, чьи значения станут индексом результата. По умолчанию — текущий индекс.values— столбец(ы), значения которого попадут в ячейки. По умолчанию — все остальные.
Возвращаемое значение
Новый DataFrame в широком формате.
Примеры
Пример 1. Базовый pivot
Длинный формат показаний нескольких датчиков → широкий:
import pandas as pd
df = pd.DataFrame({
"ts": ["t0", "t0", "t1", "t1"],
"sensor": ["A", "B", "A", "B"],
"temp": [22.1, 23.0, 22.3, 23.2],
})
print(df.pivot(index="ts", columns="sensor", values="temp"))
sensor A B
ts
t0 22.1 23.0
t1 22.3 23.2
Пример 2. Без values — все остальные столбцы
import pandas as pd
df = pd.DataFrame({
"ts": ["t0", "t1"],
"sensor": ["A", "A"],
"temp": [22.0, 23.0],
"hum": [55, 60],
})
print(df.pivot(index="ts", columns="sensor"))
temp hum
sensor A A
ts
t0 22.0 55
t1 23.0 60
Пример 3. Список values
import pandas as pd
df = pd.DataFrame({
"day": ["Mon", "Mon", "Tue", "Tue"],
"robot": ["P1", "P2", "P1", "P2"],
"runs": [5, 7, 6, 8],
"errors": [1, 0, 2, 1],
})
print(df.pivot(index="day", columns="robot",
values=["runs", "errors"]))
runs errors
robot P1 P2 P1 P2
day
Mon 5 7 1 0
Tue 6 8 2 1
Пример 4. Ошибка при дубликатах
import pandas as pd
df = pd.DataFrame({
"ts": ["t0", "t0"],
"sensor": ["A", "A"],
"temp": [22, 23],
})
try:
df.pivot(index="ts", columns="sensor", values="temp")
except ValueError as e:
print("ошибка:", str(e)[:60])
ошибка: Index contains duplicate entries, cannot reshape
Пример 5. Связка melt → pivot (обратное преобразование)
import pandas as pd
wide = pd.DataFrame({"ts": ["t0", "t1"], "A": [22, 23], "B": [21, 24]})
long = wide.melt(id_vars="ts", var_name="sensor", value_name="temp")
restored = long.pivot(index="ts", columns="sensor", values="temp")
print(restored)
sensor A B
ts
t0 22 21
t1 23 24
См. также
Примечание
Лицензия и источники
Техническое описание функции адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Примеры и пояснения — © AlashEd Wiki.