Pandas pivot
pivot превращает «длинную» таблицу в «широкую»: значение из одного столбца
становится именем столбца результата. В отличие от Pandas pivot_table,
pivot не агрегирует — он просто перекладывает данные. Поэтому ключ
(index, columns) должен быть уникальным.
Когда использовать
В одной строке хранится: устройство, датчик, значение — а нужно «датчик в столбцы».
Лог в формате (time, key, value) → таблица с time по строкам и key по столбцам.
Пример 1. Простой pivot
import pandas as pd
df = pd.DataFrame({
"device": ["bot1", "bot1", "bot2", "bot2"],
"sensor": ["temp", "hum", "temp", "hum"],
"value": [22, 55, 24, 50],
})
print(df.pivot(index="device", columns="sensor", values="value"))
Output:
sensor hum temp
device
bot1 55 22
bot2 50 24
Пример 2. Без values
import pandas as pd
df = pd.DataFrame({
"t": [0, 0, 1, 1],
"sensor": ["a", "b", "a", "b"],
"value": [1, 2, 3, 4],
})
print(df.pivot(index="t", columns="sensor"))
Output:
value
sensor a b
t
0 1 2
1 3 4
Без явного values Pandas сам разворачивает все остальные столбцы.
Пример 3. Несколько values
import pandas as pd
df = pd.DataFrame({
"t": [0, 0, 1, 1],
"sensor": ["a", "b", "a", "b"],
"value": [1, 2, 3, 4],
"ok": [True, False, True, True],
})
print(df.pivot(index="t", columns="sensor", values=["value", "ok"]))
Output:
value ok
sensor a b a b
t
0 1 2 True False
1 3 4 True True
Пример 4. Распаковка обратно через melt
import pandas as pd
wide = pd.DataFrame({"device": ["bot1", "bot2"], "temp": [22, 24], "hum": [55, 50]})
long = wide.melt(id_vars="device", var_name="sensor", value_name="value")
print(long)
Output:
device sensor value
0 bot1 temp 22
1 bot2 temp 24
2 bot1 hum 55
3 bot2 hum 50
Пример 5. Ошибка дубликатов
import pandas as pd
df = pd.DataFrame({
"t": [0, 0, 0],
"sensor": ["a", "a", "b"],
"value": [1, 2, 3],
})
try:
df.pivot(index="t", columns="sensor", values="value")
except ValueError as e:
print("Ошибка:", e)
Output:
Ошибка: Index contains duplicate entries, cannot reshape
Для случаев с дубликатами нужен pivot_table с агрегацией.
Пример 6. После pivot вернуть индекс в столбец
import pandas as pd
df = pd.DataFrame({
"device": ["bot1", "bot1", "bot2", "bot2"],
"sensor": ["temp", "hum", "temp", "hum"],
"value": [22, 55, 24, 50],
})
w = df.pivot(index="device", columns="sensor", values="value").reset_index()
print(w)
Output:
sensor device hum temp
0 bot1 55 22
1 bot2 50 24
Подводные камни
pivotпадает на дубликатах — беритеpivot_table.Имя оси столбцов после pivot — это имя бывшего столбца
sensor. Чтобы убрать:df.columns.name = None.После pivot обычно появляется
MultiIndexпо столбцам — это иногда мешает при экспорте в CSV.
См. также
Примечание
Лицензия и источники
Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.