← Назад к вопросам

В чем разница между 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

Сравнительная таблица

Параметрpivotpivot_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!