withMissingValues method

DataFrame withMissingValues([
  1. Iterable<String>? columns
])

A new data frame comprising the rows with at least one missing value.

Example:

final d = """
    a,b
    1,apple
    2,ball
 <NA>,cat
    4,<NA>
    5,egg
""".parseAsCsv();
print(d);
print(d.withMissingValues());

.---.-------.
|a  |b      |
:---+-------:
|1  |apple  |
|2  |ball   |
|NaN|cat    |
|4  |<NA>   |
|5  |egg    |
'---'-------'

.---.------.
|a  |b     |
:---+------:
|NaN|cat   |
|4  |<NA>  |
'---'------'

Implementation

DataFrame withMissingValues([Iterable<String>? columns]) {
  columns =
      columns ?? [...this.numericColumns.keys, ...this.categoricColumns.keys];

  if (columns.any((key) =>
      !this.numericColumns.containsKey(key) &&
      !this.categoricColumns.containsKey(key))) {
    throw PackhorseError.badArgument(
        "Bad column names $columns" "(DataFrame.withMissingValues).");
  }

  final numericColumns = <String, NumericColumn>{},
      categoricColumns = <String, CategoricColumn>{},
      indicesWithMissingValues = _rowIndicesWithMissingValues(columns);

  for (final MapEntry(:key, :value) in this.numericColumns.entries) {
    numericColumns[key] =
        NumericColumn(value.valuesAtIndices(indicesWithMissingValues));
  }

  for (final MapEntry(:key, :value) in this.categoricColumns.entries) {
    categoricColumns[key] =
        CategoricColumn(value.valuesAtIndices(indicesWithMissingValues));
  }

  return DataFrame(
    numericColumns: numericColumns,
    categoricColumns: categoricColumns,
  );
}