Фильтрация и сортировка
Фильтрация оставляет в таблице только строки, которые подходят под заданное условие. Сортировка меняет порядок строк.
Как и другие операции DataFrame, Filter и SortBy не изменяют исходную таблицу. Они возвращают новый DataFrame.
var good := df.Filter(row -> row['Балл'] >= 80);Если результат нужен дальше, его нужно сохранить в переменную или продолжить цепочку операций.
Простая фильтрация
Заголовок раздела «Простая фильтрация»Filter принимает условие для одной строки таблицы. Если условие истинно, строка попадает в результат.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Возраст,Балл Анна,8А,14,91 Борис,8Б,15,76 Вера,8А,14,84 Глеб,8Б,15,68 Дина,8А,14,95 ''');
var good := df.Filter(row -> row['Балл'] >= 80);
good.Print;end.Вывод:
Имя Класс Возраст БаллАнна 8А 14 91Вера 8А 14 84Дина 8А 14 95В условии row -> row['Балл'] >= 80 переменная row обозначает текущую строку таблицы.
Несколько условий
Заголовок раздела «Несколько условий»Условия можно объединять с помощью and, or и скобок. Например, выберем продажи продуктов, где количество не меньше 2.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Товар,Категория,Количество,Цена Хлеб,Продукты,2,45.50 Молоко,Продукты,1,72.90 Блокнот,Канцтовары,3,120 Яблоки,Продукты,4,58.25 Ручка,Канцтовары,5,35 ''');
var res := df.Filter(row -> (row['Категория'] = 'Продукты') and (row['Количество'] >= 2) );
res.Print;end.Вывод:
Товар Категория Количество Цена Хлеб Продукты 2 45.50Яблоки Продукты 4 58.25Скобки делают условие понятнее, особенно когда в нём несколько частей.
Пропущенные значения
Заголовок раздела «Пропущенные значения»Если в столбце есть пропуски, перед сравнением удобно проверить, что значение существует. Для значения ячейки доступно свойство IsValid.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Возраст,Балл Анна,8А,14,91 Борис,8Б,15,76 Вера,8А,14,84 Глеб,8Б,15,68 Дина,8А,14,95 Егор,8Б,15,NA ''');
var res := df.Filter(row -> row['Балл'].IsValid and (row['Балл'] >= 80) );
res.Print;end.row['Балл'].IsValid означает: в этой строке в столбце Балл есть настоящее значение, а не NA.
Сортировка по возрастанию
Заголовок раздела «Сортировка по возрастанию»SortBy сортирует таблицу по указанному столбцу.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Возраст,Балл Анна,8А,14,91 Борис,8Б,15,76 Вера,8А,14,84 Глеб,8Б,15,68 Дина,8А,14,95 ''');
var sorted := df.SortBy('Балл');
sorted.Print;end.Вывод:
Имя Класс Возраст Балл Глеб 8Б 15 68Борис 8Б 15 76 Вера 8А 14 84 Анна 8А 14 91 Дина 8А 14 95По умолчанию сортировка идёт по возрастанию.
Сортировка по убыванию
Заголовок раздела «Сортировка по убыванию»Для сортировки по убыванию используется параметр descending.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Возраст,Балл Анна,8А,14,91 Борис,8Б,15,76 Вера,8А,14,84 Глеб,8Б,15,68 Дина,8А,14,95 ''');
var sorted := df.SortBy('Балл', descending := True);
sorted.Print;end.Такой вариант удобен, когда нужно увидеть сначала самые большие значения: лучшие баллы, самые высокие цены, крупнейшие города.
Сортировка по нескольким столбцам
Заголовок раздела «Сортировка по нескольким столбцам»Можно сортировать таблицу сразу по нескольким столбцам. Например, сначала по классу, а внутри каждого класса по баллу.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Возраст,Балл Анна,8А,14,91 Борис,8Б,15,76 Вера,8А,14,84 Глеб,8Б,15,68 Дина,8А,14,95 ''');
var sorted := df.SortBy(['Класс', 'Балл'], [False, True]);
sorted.Print;end.Во втором массиве задаётся направление сортировки для каждого столбца:
False— по возрастанию;True— по убыванию.
В примере классы идут по возрастанию, а баллы внутри класса — от большего к меньшему.
Цепочка операций
Заголовок раздела «Цепочка операций»Фильтрацию и сортировку часто используют вместе с выбором столбцов. Так получается короткий и читаемый код обработки таблицы.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Класс,Возраст,Балл Анна,8А,14,91 Борис,8Б,15,76 Вера,8А,14,84 Глеб,8Б,15,68 Дина,8А,14,95 Егор,8Б,15,NA ''');
var res := df .Filter(row -> row['Балл'].IsValid) .Filter(row -> row['Балл'] >= 80) .SortBy('Балл', descending := True) .Select(['Имя', 'Класс', 'Балл']);
res.Print;end.Вывод:
Имя Класс БаллДина 8А 95Анна 8А 91Вера 8А 84Такой стиль читается как последовательность шагов: убрать строки без балла, оставить хорошие результаты, отсортировать, выбрать нужные столбцы.
Что важно помнить
Заголовок раздела «Что важно помнить»Filterоставляет строки, для которых условие истинно.SortByвозвращает новую отсортированную таблицу.- Исходный
dfпри этом не меняется. - Для пропусков можно использовать
row['ИмяСтолбца'].IsValid. - Несколько операций удобно объединять в цепочку.