Pandas pivot_table

pivot_table — это «pivot с агрегацией». Когда на пересечении (строка, столбец) может быть несколько значений, pivot_table сворачивает их функцией (по умолчанию — среднее). По сути это аналог сводной таблицы Excel.

Когда использовать

  • Среднее значение датчика по часам/устройствам.

  • Сводный отчёт «сколько событий каждого типа по дням».

  • Замена pivot, когда есть дубликаты ключей.

Пример 1. Среднее по группам

import pandas as pd

df = pd.DataFrame({
    "device": ["bot1", "bot1", "bot2", "bot2"],
    "sensor": ["temp", "temp", "temp", "temp"],
    "value":  [22, 24, 26, 28],
})
print(df.pivot_table(index="device", columns="sensor", values="value"))

Output:

sensor  temp
device
bot1    23.0
bot2    27.0

Каждое значение — среднее двух измерений.

Пример 2. Своя функция

import pandas as pd

df = pd.DataFrame({
    "device": ["bot1", "bot1", "bot2"],
    "sensor": ["t", "t", "t"],
    "value": [10, 20, 30],
})
print(df.pivot_table(index="device", values="value", aggfunc="sum"))

Output:

        value
device
bot1       30
bot2       30

Пример 3. Несколько функций

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b"], "v": [10, 20, 30]})
print(df.pivot_table(index="d", values="v", aggfunc=["mean", "max"]))

Output:

   mean max
      v   v
d
a    15  20
b    30  30

Пример 4. margins

Добавить итоговую строку/столбец:

import pandas as pd

df = pd.DataFrame({
    "d": ["a", "a", "b", "b"],
    "s": ["t", "h", "t", "h"],
    "v": [10, 20, 30, 40],
})
print(df.pivot_table(index="d", columns="s", values="v", aggfunc="sum", margins=True))

Output:

s     h   t  All
d
a    20  10   30
b    40  30   70
All  60  40  100

Пример 5. fill_value

Заполнить дыры:

import pandas as pd

df = pd.DataFrame({
    "d": ["a", "b"], "s": ["t", "h"], "v": [10, 20],
})
print(df.pivot_table(index="d", columns="s", values="v", fill_value=0))

Output:

s  h   t
d
a  0  10
b 20   0

Пример 6. Подсчёт строк

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b"], "s": ["t", "t", "h"]})
print(df.pivot_table(index="d", columns="s", aggfunc="size", fill_value=0))

Output:

s  h  t
d
a  0  2
b  1  0

Пример 7. Несколько values

import pandas as pd

df = pd.DataFrame({
    "d": ["a", "a", "b"],
    "v1": [1, 2, 3],
    "v2": [10, 20, 30],
})
print(df.pivot_table(index="d", values=["v1", "v2"], aggfunc="sum"))

Output:

   v1  v2
d
a   3  30
b   3  30

Подводные камни

  • По умолчанию агрегатная функция — mean. Для строковых данных она упадёт — всегда указывайте aggfunc явно.

  • NaN могут появиться там, где не было данных — используйте fill_value.

  • Для очень больших данных pivot_table медленнее, чем groupby + unstack.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.