Группировка
Группировка нужна, когда таблицу надо разбить на части по значениям одного или нескольких столбцов, а затем посчитать результат для каждой группы.
Например, можно узнать:
- сколько учеников в каждом классе;
- какой средний балл у каждого класса;
- какие результаты получились по каждому предмету;
- как отличаются группы после фильтрации таблицы.
GroupBy сам по себе только создаёт группы. Чтобы получить таблицу с результатом, после него вызывают агрегирующую операцию: Count, Mean, Min, Max, Std, Describe.
Количество строк в группах
Заголовок раздела «Количество строк в группах»Самый простой вариант группировки — посчитать, сколько строк относится к каждому значению столбца.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Балл Анна,8А,91 Борис,8Б,76 Вера,8А,84 Глеб,8Б,68 Дина,8А,95 Егор,8Б,72 ''');
df.GroupBy('Класс').Count.Print;end.Здесь GroupBy('Класс') разбивает строки на группы по классу, а Count считает количество строк в каждой группе.
Для простого подсчёта значений одного столбца можно использовать и более короткий вариант:
df['Класс'].ValueCounts.Print;GroupBy нужен тогда, когда после разбиения на группы надо считать статистики по другим столбцам.
Среднее значение по группам
Заголовок раздела «Среднее значение по группам»Посчитаем средний балл в каждом классе.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Балл Анна,8А,91 Борис,8Б,76 Вера,8А,84 Глеб,8Б,68 Дина,8А,95 Егор,8Б,72 ''');
df.GroupBy('Класс').Mean('Балл').Print;end.В результате получится новая таблица: одна строка на каждый класс и отдельный столбец со средним баллом.
Так же можно считать минимум, максимум и стандартное отклонение:
df.GroupBy('Класс').Min('Балл').Print;df.GroupBy('Класс').Max('Балл').Print;df.GroupBy('Класс').Std('Балл').Print;Несколько статистик
Заголовок раздела «Несколько статистик»Если нужна краткая сводка сразу с несколькими статистиками, используйте Describe.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Балл Анна,8А,91 Борис,8Б,76 Вера,8А,84 Глеб,8Б,68 Дина,8А,95 Егор,8Б,72 ''');
df.GroupBy('Класс').Describe('Балл').Print;end.Describe('Балл') строит по каждой группе набор основных статистик: количество значений, среднее, стандартное отклонение, минимум и максимум.
Группировка по нескольким столбцам
Заголовок раздела «Группировка по нескольким столбцам»Группировать можно не только по одному столбцу. Например, посчитаем средний балл по каждому предмету внутри каждого класса.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Предмет,Балл Анна,8А,Математика,91 Анна,8А,Информатика,96 Борис,8Б,Математика,76 Борис,8Б,Информатика,82 Вера,8А,Математика,84 Вера,8А,Информатика,90 Глеб,8Б,Математика,68 Глеб,8Б,Информатика,74 ''');
df.GroupBy(['Класс', 'Предмет']) .Mean('Балл') .Print;end.В такой таблице группа задаётся парой значений: класс и предмет.
Фильтрация перед группировкой
Заголовок раздела «Фильтрация перед группировкой»Перед группировкой часто сначала отбирают нужные строки. Например, уберём пропущенные баллы и посчитаем средний результат только по заполненным значениям.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Балл Анна,8А,91 Борис,8Б,76 Вера,8А,84 Глеб,8Б,68 Дина,8А,95 Егор,8Б,NA ''');
df.Filter(row -> row['Балл'].IsValid) .GroupBy('Класс') .Mean('Балл') .Print;end.Такая цепочка читается как последовательность действий: убрать строки без балла, сгруппировать по классу, посчитать средний балл.
Пример с продажами
Заголовок раздела «Пример с продажами»Группировка часто используется, чтобы получить итоги по категориям: например, посчитать выручку по каждому типу товара.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Товар,Категория,Количество,Цена Хлеб,Продукты,2,45.50 Молоко,Продукты,1,72.90 Блокнот,Канцтовары,3,120 Яблоки,Продукты,4,58.25 Ручка,Канцтовары,5,35 ''');
df.WithColumnFloat('Сумма', row -> row['Количество'] * row['Цена']) .GroupBy('Категория') .Sum('Сумма') .Print;end.Что важно помнить
Заголовок раздела «Что важно помнить»GroupByразбивает таблицу на группы, но не печатает результат сам по себе.- После
GroupByнужна агрегирующая операция:Count,Mean,Min,Max,Std,Describe. - Группировать можно по одному столбцу или по нескольким столбцам.
- Для простого подсчёта значений одного столбца часто достаточно
df['Столбец'].ValueCounts. - Перед группировкой можно использовать
Filter,SortBy,Selectи другие операции DataFrame.