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

Действия со столбцами

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

В DataFrame такие операции не изменяют исходную таблицу. Каждый метод возвращает новый DataFrame, поэтому результат нужно сохранить в новую переменную или присвоить обратно той же переменной.

var df2 := df.Select(['Имя', 'Класс', 'Балл']);

Если старая версия таблицы больше не нужна, можно написать так:

df := df.Select(['Имя', 'Класс', 'Балл']);

Такой стиль делает код более явным: всегда видно, на каком шаге получается новая таблица.

Select оставляет в таблице только указанные столбцы.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Класс,Рост,Вес,Балл
Анна,8А,160,50,91
Борис,8Б,172,63,76
Вера,8А,158,48,84
''');
var marks := df.Select(['Имя', 'Класс', 'Балл']);
marks.Print;
end.

Вывод:

Имя Класс Балл
Анна 8А 91
Борис 8Б 76
Вера 8А 84

Исходная таблица df при этом не меняется. Новая таблица хранится в переменной marks.

Drop удаляет указанные столбцы и возвращает новую таблицу.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Класс,Рост,Вес,Балл
Анна,8А,160,50,91
Борис,8Б,172,63,76
Вера,8А,158,48,84
''');
var shortDf := df.Drop(['Рост', 'Вес']);
shortDf.Print;
end.

Вывод:

Имя Класс Балл
Анна 8А 91
Борис 8Б 76
Вера 8А 84

Select и Drop часто решают похожие задачи:

  • Select удобен, когда нужно явно перечислить нужные столбцы;
  • Drop удобен, когда нужно убрать несколько лишних столбцов.

Rename меняет имя столбца в новой таблице.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Класс,Рост,Вес,Балл
Анна,8А,160,50,91
Борис,8Б,172,63,76
Вера,8А,158,48,84
''');
var renamed := df.Rename('Балл', 'ИтоговыйБалл');
renamed.Print;
end.

Переименование полезно, когда названия пришли из файла и их нужно сделать понятнее для дальнейшего кода.

Методы WithColumn... добавляют новый столбец. Суффикс в имени метода задаёт тип нового столбца: например, WithColumnBool, WithColumnInt, WithColumnFloat, WithColumnString.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Класс,Рост,Вес,Балл
Анна,8А,160,50,91
Борис,8Б,172,63,76
Вера,8А,158,48,84
''');
var withPassed := df.WithColumnBool(
'Сдал',
row -> row['Балл'] >= 80
);
withPassed.Print;
end.

Вывод:

Имя Класс Рост Вес Балл Сдал
Анна 8А 160 50 91 True
Борис 8Б 172 63 76 False
Вера 8А 158 48 84 True

В лямбда-выражении row -> ... доступна текущая строка таблицы. Значения столбцов можно читать по имени, например row['Балл'].

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

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Товар,Категория,Количество,Цена
Хлеб,Продукты,2,45.50
Молоко,Продукты,1,72.90
Блокнот,Канцтовары,3,120
''');
var withTotal := df.WithColumnFloat(
'Сумма',
row -> row['Количество'] * row['Цена']
);
withTotal.Select(['Товар', 'Количество', 'Цена', 'Сумма']).Print;
end.

Такой приём часто используется при подготовке признаков: из существующих столбцов создаются новые, более удобные для анализа или обучения модели.

Так как операции возвращают новый DataFrame, их можно объединять в цепочку.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Товар,Категория,Количество,Цена
Хлеб,Продукты,2,45.50
Молоко,Продукты,1,72.90
Блокнот,Канцтовары,3,120
''');
var res := df
.Drop(['Категория'])
.Rename('Цена', 'ЦенаРуб')
.WithColumnFloat('Сумма', row -> row['Количество'] * row['ЦенаРуб']);
res.Print;
end.

Цепочка читается сверху вниз: удалить лишний столбец, переименовать цену, добавить вычисляемую сумму.

  • Select, Drop, Rename и WithColumn... не изменяют исходный DataFrame.
  • Если нужен результат операции, его надо сохранить.
  • Select оставляет указанные столбцы.
  • Drop удаляет указанные столбцы.
  • Rename переименовывает столбец.
  • WithColumn... создаёт новый вычисляемый столбец.
  • Цепочки операций помогают записывать обработку таблицы как последовательность понятных шагов.