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

Пропущенные данные

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

Такие пустые места называют пропусками. В CSV пропуском может быть пустая ячейка или значение NA. DataFrame хранит такой элемент как отсутствующее значение, а не как строку "NA".

С такими данными всё равно приходится работать: иногда строки с пропусками удаляют, иногда пропуски заполняют, а иногда просто не учитывают в конкретном вычислении. Главное — заметить их и решить, что с ними делать.

MissingCount показывает число пропусков в одном столбце, а MissingCounts строит таблицу по всем столбцам.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Возраст,Балл
Анна,14,91
Борис,,76
Вера,14,NA
Глеб,15,68
''');
Println('Пропусков в столбце Возраст:', df.MissingCount('Возраст'));
Println('Пропусков в столбце Балл:', df.MissingCount('Балл'));
df.MissingCounts.Print;
end.

В фильтрах удобно проверять конкретную ячейку через IsValid.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Возраст,Балл
Анна,14,91
Борис,,76
Вера,14,NA
Глеб,15,68
''');
df.Filter(row -> row['Балл'].IsValid).Print;
end.

row['Балл'].IsValid означает, что в этой строке в столбце Балл есть настоящее значение.

DropMissing удаляет строки, где есть хотя бы один пропуск.

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Имя,Возраст,Балл
Анна,14,91
Борис,,76
Вера,14,NA
Глеб,15,68
''');
df.DropMissing.Print;
end.

Если важны только некоторые столбцы, укажите их явно.

df.DropMissing(['Балл']).Print;

Такой вариант удалит только строки, где пропущен Балл, и не будет учитывать пропуски в других столбцах.

На уровне DataFrame обычно достаточно найти или удалить пропуски. Для задач машинного обучения пропуски чаще заполняют в разделе подготовки данных с помощью Imputer.

Например, Imputer может заменить пропущенные числовые значения средним, медианой или другим правилом.

  • NA и пустая ячейка считаются пропущенными значениями.
  • MissingCount считает пропуски в одном столбце.
  • MissingCounts показывает пропуски по всей таблице.
  • DropMissing возвращает новый DataFrame.
  • Перед сравнением значения можно проверить row['Столбец'].IsValid.