Ответ
Оба метода преобразуют таблицу из длинного формата в широкий, но pivot_table — это более мощная и гибкая версия.
pivot— простой метод для перестановки данных. Он требует, чтобы комбинация значений, указанных в параметрахindexиcolumns, была уникальной. Если найдутся дубликаты, метод выбросит ошибкуValueError. Агрегация данных не поддерживается.pivot_table— метод для сводной таблицы (pivot table) с агрегацией. Он специально разработан для обработки дубликатов: если для одной ячейки сводной таблицы находится несколько значений, они агрегируются с помощью функции (по умолчаниюmean).
Пример, показывающий разницу:
import pandas as pd
# Данные с дубликатом: продажи продукта 'A' 10 января учтены дважды
df = pd.DataFrame({
'date': ['2024-01-10', '2024-01-10', '2024-01-11'],
'product': ['A', 'A', 'B'],
'sales': [100, 150, 200]
})
# pivot — УПАДЕТ С ОШИБКОЙ из-за дубликата (date='2024-01-10', product='A')
# df.pivot(index='date', columns='product', values='sales')
# pivot_table — КОРРЕКТНО просуммирует дубликаты
pivot_df = df.pivot_table(
index='date',
columns='product',
values='sales',
aggfunc='sum', # Явно указываем функцию агрегации
fill_value=0 # Заполняем пропуски нулями
)
print(pivot_df)
# product A B
# date
# 2024-01-10 250 0
# 2024-01-11 0 200
Вывод: Используйте pivot только когда уверены в уникальности ключей. В подавляющем большинстве реальных случаев, особенно с "сырыми" данными, нужен pivot_table с явным указанием aggfunc (например, 'sum', 'count', 'mean').
Ответ 18+ 🔞
Давай разберёмся, что тут за ебушки-воробушки с этими методами. Вроде оба делают одно и то же — из длинной таблицы делают широкую, но под капотом разница, как между велосипедом и танком.
pivot— это как простой велосипед. Он тупо переставляет строки в столбцы. Но у него одно жёсткое требование: комбинация того, что ты укажешь вindexиcolumns, должна быть уникальной. Найдётся дубликат — он тебе сразу в глаза: «ValueError, иди нахуй, разберись с данными». Никакой агрегации, никаких компромиссов.pivot_table— это уже сводная таблица, она же танк. Она агрегирует данные. Нашёл дубликаты на пересечении? Да похуй! Он их склеит с помощью заданной функции (по умолчанию — среднее,mean). Это его основная работа.
Смотри, наглядный пиздец:
import pandas as pd
# Данные, где продажи продукта 'A' за 10 января записали два раза. Бывает же, распиздяи.
df = pd.DataFrame({
'date': ['2024-01-10', '2024-01-10', '2024-01-11'],
'product': ['A', 'A', 'B'],
'sales': [100, 150, 200]
})
# pivot — ВЫЛЕТИТ С ТРЕСКОМ, потому что для даты '2024-01-10' и продукта 'A' два значения.
# df.pivot(index='date', columns='product', values='sales') # Ошибка, ебать копать!
# pivot_table — спокойно всё просуммирует и выдаст красивую табличку.
pivot_df = df.pivot_table(
index='date',
columns='product',
values='sales',
aggfunc='sum', # Говорим ему: «Суммируй, если налезло несколько значений, ёпта»
fill_value=0 # А если вообще ничего не было, ставь ноль, а не NaN
)
print(pivot_df)
# product A B
# date
# 2024-01-10 250 0
# 2024-01-11 0 200
Короче, мораль: pivot — только для стерильных, идеальных данных, где ты на 146% уверен, что дубликатов нет. В реальной жизни, где данные всегда с грязными руками, почти всегда нужен pivot_table, и не забывай явно указывать aggfunc ('sum', 'count', 'mean'), а то он по умолчанию среднее посчитает, а тебе надо сумму — и будет тебе хиросима в отчёте.