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.