New We are sorting MAX channels into categories and territories. Read the news
Public channel ID 72343601022986

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

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

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

Channels in category
101 481
This channel's rank
№ 26 404
Open category →
Channels in category
2 112
This channel's rank
№ 250
Open category →
Channels in category
1 492
This channel's rank
№ 465
Open category →
Channels in category
5 768
This channel's rank
№ 939
Open category →
Russia
Open in MAX

Posts for the period

By reactions

Search and the whole feed — after free registration. Custom dates — with a subscription; the channel owner sees them for free. Sorting by reactions — with a subscription. Sign up

Loading…

🤗 Сводная таблица 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.
Views: 150
Go to post Open in MAX Report an inaccuracy
VKontakte Telegram Odnoklassniki
Favorites at datool.ru

Follow the channel in your account

Sign up at datool.ru to add the channel “Аналитика, машинное обучение и наука о данных для начинающих / Analytics, machine learning, and data science for beginners. Просто о сложных технологиях” to favorites and track its metrics.

Sign up
For channel owners

Verify your channel

Sign in or sign up at datool.ru, then add our bot to the channel following the instructions in your account. Once ownership is verified, the lock disappears and channel management becomes available.

Sign in or sign up

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go