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

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

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

Такие пустые места называют пропусками. В 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.

Вывод:

Пропусков в столбце Возраст: 1
Пропусков в столбце Балл: 1
Столбец Пропусков
Имя 0
Возраст 1
Балл 1

Проверка на пропущенное значение в ячейке

Заголовок раздела «Проверка на пропущенное значение в ячейке»

При фильтрации удобно проверять конкретную ячейку через IsValid:

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

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

Вывод:

Имя Возраст Балл
Анна 14 91
Борис NA 76
Глеб 15 68

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

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

Вывод:

Имя Возраст Балл
Анна 14 91
Глеб 15 68

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

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

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

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

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

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