Условие
В чём разница между df.pivot(...) и df.pivot_table(...)? Когда первая падает с ошибкой, а вторая работает? Покажи примеры на датафрейме sales(date, product, revenue).
Решение
Главное отличие
pivot— простой reshape, требует, чтобы пара(index, columns)была уникальной. Если есть дубли —ValueError: Index contains duplicate entries, cannot reshape.pivot_table— агрегирует дубликаты функциейaggfunc(по умолчаниюmean). Это «pivot + groupby в одном».
Примеры
import pandas as pd
# Если данные уже агрегированы (одна строка на пару date×product):
wide = sales.pivot(index='date', columns='product', values='revenue')
# Если в данных по нескольку строк на пару — нужно агрегировать:
wide = sales.pivot_table(
index='date',
columns='product',
values='revenue',
aggfunc='sum', # 'mean' по умолчанию — опасно для денег
fill_value=0,
margins=True, # добавит итоги
)Подводные камни
- Дефолтный
aggfunc='mean'вpivot_tableдля сумм/выручки даёт некорректный результат — всегда явно указывайтеaggfunc='sum'. pivotне умеет несколькоvaluesчерезaggfunc— для multi-metric нуженpivot_tableсо спискомvaluesиaggfunc.fill_value=0нужен явно, иначе пустые ячейки будутNaNи сломают арифметику дальше.margins=Trueдобавляет строку/колонкуAll— её надо помнить и фильтровать, если считается дальше.pivot_tableможет неожиданно отсортировать колонки лексикографически — для категориальных порядков задавайтеCategorical(ordered=True).
Эталонный ответ
pivot — reshape без агрегации, требует уникальности; pivot_table — reshape + groupby, агрегирует дубли. Для аналитики почти всегда нужен pivot_table с явным aggfunc='sum' и fill_value=0.