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.