← Назад к вопросам
В чем разница между pivot и pivot_table в Pandas?
2.0 Middle🔥 101 комментариев
#Pandas и обработка данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Pivot vs Pivot_Table в Pandas
Оба метода преобразуют данные из длинного формата в широкий, но различаются функциональностью.
Основное различие
Pivot — для уникальных комбинаций
import pandas as pd
# Исходные данные: длинный формат
df = pd.DataFrame({
"date": ["2024-01-01", "2024-01-02", "2024-01-03"],
"store": ["A", "A", "A"],
"sales": [100, 150, 200]
})
# pivot требует УНИКАЛЬНЫЕ комбинации индекса и столбцов
result = df.pivot(index="date", columns="store", values="sales")
# store
# date A
# 2024-01-01 100
# 2024-01-02 150
# 2024-01-03 200
Ключевое правило: каждая комбинация (индекс, столбец) должна быть УНИКАЛЬНОЙ.
# ОШИБКА! Дублирующиеся комбинации ("2024-01-01", "A" встречается 2 раза)
df_bad = pd.DataFrame({
"date": ["2024-01-01", "2024-01-01", "2024-01-02"],
"store": ["A", "A", "A"],
"sales": [100, 50, 150] # две разные продажи в один день в магазине A
})
df_bad.pivot(index="date", columns="store", values="sales")
# ValueError: Index contains duplicate entries, cannot reshape
Pivot_Table — для дубликатов (с агрегацией)
# pivot_table АГРЕГИРУЕТ дублирующиеся комбинации (по умолчанию mean)
result = df_bad.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc="sum" # сумма дублей
)
# store
# date A
# 2024-01-01 150 # 100 + 50 = 150
# 2024-01-02 150
Сравнительная таблица
| Параметр | pivot | pivot_table |
|---|---|---|
| Дубликаты | ❌ Ошибка | ✅ Агрегирует |
| Параметр aggfunc | ❌ Нет | ✅ Нужен |
| Скорость | ⚡ Быстрее | 🐢 Медленнее |
| Использование | Чистые данные | Сырые данные |
| Сложность | Простой | Мощный |
Практические примеры
Пример 1: Таблица продаж по магазинам и датам
df = pd.DataFrame({
"date": ["2024-01-01", "2024-01-01", "2024-01-02", "2024-01-02"],
"store": ["A", "B", "A", "B"],
"sales": [100, 200, 150, 250]
})
# pivot - работает (нет дублей)
result = df.pivot(index="date", columns="store", values="sales")
# store A B
# date
# 2024-01-01 100 200
# 2024-01-02 150 250
Пример 2: Несколько чеков в один день
df = pd.DataFrame({
"date": ["2024-01-01", "2024-01-01", "2024-01-01", "2024-01-02"],
"store": ["A", "A", "B", "A"],
"sales": [100, 50, 200, 150] # два чека в день в магазине A
})
# pivot - ошибка!
# df.pivot(index="date", columns="store", values="sales")
# ValueError: Index contains duplicate entries
# pivot_table - работает (агрегирует)
result = df.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc="sum" # sum, mean, count, min, max и т.д.
)
# store A B
# date
# 2024-01-01 150 200 # 100 + 50 = 150
# 2024-01-02 150 NaN
Параметр aggfunc в pivot_table
# Средняя продажа
df.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc="mean" # или np.mean
)
# Количество чеков
df.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc="count"
)
# Сразу несколько агрегаций
df.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc=["sum", "mean", "count"] # получишь MultiIndex
)
# Разные агрегаций для разных столбцов
df.pivot_table(
index="date",
columns="store",
values=["sales", "quantity"],
aggfunc={"sales": "sum", "quantity": "mean"}
)
Когда использовать что
pivot
✅ Используй, если:
- Данные чистые, без дубликатов
- Нужна максимальная скорость
- Каждой комбинации соответствует одно значение
- Простое преобразование узкое → широкое
# Пример: дневные данные (по одной записи в день на магазин)
df_clean = pd.DataFrame({
"date": ["2024-01-01", "2024-01-02"],
"store": ["A", "A"],
"sales": [100, 150]
})
df_clean.pivot(index="date", columns="store", values="sales") # OK
pivot_table
✅ Используй, если:
- Есть дублирующиеся комбинации
- Нужно агрегировать данные
- Нужна гибкость (разные aggfunc)
- Работаешь с сырыми данными (транзакции, логи и т.д.)
# Пример: нужно суммировать продажи за день (может быть несколько чеков)
df_raw = pd.DataFrame({
"date": ["2024-01-01", "2024-01-01", "2024-01-02"],
"store": ["A", "A", "A"],
"sales": [100, 50, 150] # два чека в день 01-01
})
df_raw.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc="sum"
) # OK, результат: [[150], [150]]
Обработка NaN значений
# pivot вернёт NaN если комбинация отсутствует
result = df.pivot(index="date", columns="store", values="sales")
# store A B
# date
# 2024-01-01 100.0 200.0
# 2024-01-02 150.0 NaN # Магазина B нет в 2024-01-02
# pivot_table может заполнить NaN
result = df.pivot_table(
index="date",
columns="store",
values="sales",
aggfunc="sum",
fill_value=0 # заполнить нулями вместо NaN
)
# store A B
# date
# 2024-01-01 100 200
# 2024-01-02 150 0 # Заполнено нулями
Помощь с памятью
Как запомнить?
- pivot = просто поворот (переворачиваем таблицу)
- pivot_table = таблица со сводкой (как в Excel Pivot Table, которая суммирует/агрегирует)
# pivot: узкая таблица → широкая (без изменения данных)
df_narrow = pd.DataFrame({
"person": ["Alice", "Bob"],
"metric": ["height", "height"],
"value": [165, 180]
})
df_wide = df_narrow.pivot(index="person", columns="metric", values="value")
# pivot_table: узкая таблица → агрегированная широкая
df_transactions = pd.DataFrame({
"person": ["Alice", "Alice", "Bob"],
"category": ["food", "food", "food"],
"amount": [50, 30, 100]
})
df_summary = df_transactions.pivot_table(
index="person",
columns="category",
values="amount",
aggfunc="sum" # сумма всех трат
)
Вывод
| Задача | Используй |
|---|---|
| Простой поворот таблицы | pivot |
| Суммировать/усредить дубликаты | pivot_table с aggfunc |
| Максимальная скорость | pivot |
| Работа с сырыми данными | pivot_table |
| Гибкость в агрегации | pivot_table |
Памятка: если у тебя падает ошибка "Index contains duplicate entries" — используй pivot_table с подходящим aggfunc!