В чем разница между методами pivot и pivot_table в Pandas?

Ответ

Оба метода преобразуют таблицу из длинного формата в широкий, но 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'), а то он по умолчанию среднее посчитает, а тебе надо сумму — и будет тебе хиросима в отчёте.