Открытый канал ID 72343601022986

Аналитика, машинное обучение и наука о данных для начинающих / Analytics, machine learning, and data science for beginners. Просто о сложных технологиях

🐍 Python для аналитики | 👨‍💻 SQL | 📊 Визуализация | ➕ Математика | 🦾 Машинное обучение (machine learning, ML) | Наука о данных (Data Science)

Канал носит исключительно информационный и ознакомительный характер. Автор делится личным опытом и субъективным мнением о программировании. Материалы не являются официальной образовательной программой

Каналов в рубрике
5 048
Место этого канала
№ 784
Открыть рубрику →
Каналов в рубрике
1 765
Место этого канала
№ 241
Открыть рубрику →
Открыть в MAX

Публикации за период

По реакциям

Поиск и вся лента — после бесплатной регистрации. Свои даты — по подписке; владелец канала видит их бесплатно. Сортировка по реакциям — по подписке. Зарегистрироваться

Загрузка…

🤗 Сводная таблица pivot_table — альтернатива groupby для матричных отчётов

🧭 Что такое pivot_table

Это группировка в матрицу: строки × столбцы = значение.
Результат — всегда DataFrame (в отличие от df.groupby(), который может вернуть Series).

📄 Аналоги

- Excel: сводная таблица (Pivot Table)
- SQL: оператор PIVOT (кросстабуляция)

📐 Когда что использовать?

- по одному признаку → groupby
- перекрёстно (2+ признака) → pivot_table
- несколько метрик в одной сводной → pivot_table(values=[...])

🔧 Синтаксис

pd.pivot_table(df,
index='строки',
columns='столбцы', # опционально
values='данные',
aggfunc='mean', # по умолчанию mean
fill_value=0, # замена всех NaN
margins=True, # итоги
sort=True)


📊 Исходные данные

df = pd.DataFrame({
'ch': ['ya','ya','vk','ok'],
'city': ['МСК','СПб','МСК','СПб'],
'cost': [15000,15000,5000,5000],
'revenue': [30000,40000,10000,None]
})


✅ Простая сводная — только index (аналог groupby)

pd.pivot_table(df, index='ch',
values=['cost','revenue'],
aggfunc='sum', fill_value=0)

cost revenue
ch
ok 5000 0
vk 5000 10000
ya 30000 70000


*Списки в values, но строка в aggfunc → две колонки, без лишнего уровня.*

🦾 Матрица (index + columns) — сила pivot_table

pd.pivot_table(df, index='ch',
columns='city',
# 🦾
values='cost',
aggfunc='sum')

city МСК СПб
ch
ok NaN 5000
vk 5000 NaN
ya 15000 15000


📌 fill_value=0 заменяет любые пропуски (NaN):

- если отсутствует комбинация строк и столбцов (пример выше);
- если агрегатная функция вернула NaN для пустой группы.

pd.pivot_table(df, index='ch',
columns='city',
values='cost',
aggfunc='sum',
fill_value=0)

city МСК СПб
ch
ok 0 5000 # нет пары → был бы NaN
vk 5000 0 # также
ya 15000 15000


Без fill_value=0 в таких ячейках будет NaN. С ним — чистая матрица без пропусков, удобна для анализа.

💡 aggfunc и values: строки vs списки (MultiIndex)

aggfunc и values задают, сколько уровней (level) будет в колонках результата (в шапке).

Правило:
- Строка (aggfunc='sum', values='cost') → плоские колонки.
- Список (даже из одного: aggfunc=['sum'], values=['cost']) → дополнительный уровень (MultiIndex).

pd.pivot_table(df, index='ch', values=['cost'], aggfunc=['sum'])

sum
cost
ch
ok 5000
vk 5000
ya 30000


Дополнение: `columns` всегда создаёт уровень — это сами столбцы матрицы, у него есть имя:

result = pd.pivot_table(df, index='ch',
columns='city',
# ← вот уровень
values='cost',
aggfunc='sum',
fill_value=0)

result.columns
# Index(['МСК', 'СПб'], dtype='object', name='city')

name='city' — это и есть уровень, который создал columns.


📊 Тип результата

type(df.groupby('ch')['revenue'].sum()) # Series
type(df.groupby('ch')[['revenue']].sum()) # DF
type(pd.pivot_table(df, index='ch', values='revenue', aggfunc='sum')) # DF

☝️ Про None → NaN (кратко)

- Числовой столбец None → NaN (единый формат для вычислений).
- Строковый столбец None остаётся None (NaN не существует для строк).
- Смешанный → None (без чисел) / NaN (с числами).
- Тип столбца определяется автоматически.
- fill_value=0 заменяет любые NaN в итоговой таблице (включая mean, median).
- Для гарантии замены в pandas < 1.3.0 (особенно при нескольких агрегациях) можно явно дописать .fillna(0):

result = pd.pivot_table(...).fillna(0)

🆚 pivot_table vs groupby

groupby:
- не строит матрицу ❌
- длинная таблица
- только вниз
- возвращает Series или DF

pivot_table:
- строит матрицу ✅
- широкая таблица
- вниз и вправо
- возвращает всегда DF

✅ Чек-лист

- groupby('col') — по одному столбцу
- groupby(['col1','col2']) — по двум
- .groupby(...)['col'].sum() → Series
- .groupby(...)[['col']].sum() → DF
- pivot_table() — перекрёстная группировка
- groupby(..., dropna=False) — не исключать пропуски

💬 Далее:
Объединение таблиц — merge, concat, join.
Просмотры: 52
Перейти в пост Открыть в MAX Сообщить о неточности
ВКонтакте Телеграм Одноклассники
Избранное в datool.ru

Следите за каналом в личном кабинете

Зарегистрируйтесь в datool.ru, чтобы добавить канал «Аналитика, машинное обучение и наука о данных для начинающих / Analytics, machine learning, and data science for beginners. Просто о сложных технологиях» в избранное и отслеживать его показатели.

Зарегистрироваться
Для владельцев каналов

Подтвердите свой канал

Войдите или зарегистрируйтесь в datool.ru, затем добавьте нашего бота в канал по инструкции в личном кабинете. После проверки владения замок исчезнет и вам станет доступно управление каналом.

Войти или зарегистрироваться

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти