Перейти к содержимому

Группировка

Группировка нужна, когда таблицу надо разбить на части по значениям одного или нескольких столбцов, а затем посчитать результат для каждой группы.

Например, можно узнать:

  • сколько учеников в каждом классе;
  • какой средний балл у каждого класса;
  • какие результаты получились по каждому предмету;
  • как отличаются группы после фильтрации таблицы.

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.