Сводная таблица pandas: агрегаты, суммы и пустые ячейки

pivot_table в pandas строит сводную таблицу и агрегирует повторные сочетания ключей. index задаёт строки, columns — столбцы, values — показатель, aggfunc — способ его расчёта.

Укажите агрегат явно

По умолчанию pivot_table считает среднее. Для суммы продаж укажите aggfunc="sum"; иначе код выполнится, но ответ может не соответствовать бизнес-задаче. fill_value=0 заполняет пустые ячейки полученного результата.

Обычный pivot только меняет форму таблицы и не агрегирует: повторная пара ключей вызовет ошибку. Выбирайте между ними по наличию повторов. Если нужны ключи в обычных столбцах после построения сводной, используйте reset_index().

Пример на других данных

import pandas as pd
df = pd.DataFrame({"shop": ["A", "A", "B"],
                   "month": ["Jan", "Jan", "Feb"], "sales": [10, 20, 7]})
p = df.pivot_table(index="shop", columns="month", values="sales",
                   aggfunc="sum", fill_value=0)
print(int(p.loc["A", "Jan"]))
print(int(p.loc["B", "Jan"]))

Результат:

30
0

Попробуйте сами

Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.

Сводная таблица продаж по отделам и кварталам: pivot_table с aggfunc, fill_value и reset_index

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая строит сводную таблицу продаж из длинного формата.

  1. Читает из stdin целое число n — количество строк таблицы (n >= 1).
  2. Читает следующие n строк; каждая содержит три токена через пробел: dept (строка без пробелов), quarter (строка вида Q1, Q2 и т.д.), amount (целое число). Пример строки: Alpha Q1 700.
  3. Строит pd.DataFrame из словаря списков с ключами 'dept', 'quarter', 'amount'.
  4. Строит сводную таблицу через pd.pivot_table с параметрами:
  • index='dept'
  • columns='quarter'
  • values='amount'
  • aggfunc='sum' — явно, так как одна пара (dept, quarter) может встречаться несколько раз
  • fill_value=0 — заполнить отсутствующие комбинации нулём
  1. Сохраняет результат в pt. Вызывает pt.reset_index(), сохраняет в pt_flat. Убирает имя оси столбцов: pt_flat.columns.name = None.
  2. Выводит строку: shape=<shape> — форму pt_flat в виде (строк, столбцов), например shape=(3, 3).
  3. Выводит строку: columns=<список> — список столбцов pt_flat в виде Python-списка, например columns=['dept', 'Q1', 'Q2']. Порядок столбцов — 'dept', затем столбцы кварталов в алфавитном порядке (pandas сортирует их автоматически).
  4. Для каждой строки pt_flat (в порядке строк) выводит одну строку вида: <dept> total=<сумма всех кварталов>. Сумму вычисляйте как сумму всех числовых столбцов pt_flat (то есть всех столбцов, кроме 'dept').

Ввод и вывод

Программа читает stdin и пишет в stdout.

Ограничения: n >= 1.

Формат ввода

n
dept1 quarter1 amount1
...
deptN quarterN amountN

Гарантируется: n >= 1; все значения dept и quarter — строки без пробелов; amount — целое число.

Формат вывода

shape=(<строк>, <столбцов>)
columns=[...]
<dept1> total=<число>
...

Пример

Ввод
6
Alpha Q1 1000
Beta Q1 500
Gamma Q2 400
Alpha Q2 300
Alpha Q1 700
Gamma Q1 0
Вывод
shape=(3, 3)
columns=['dept', 'Q1', 'Q2']
Alpha total=2000
Beta total=500
Gamma total=400
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

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

Связанные задачи