Swift MLDataTable - как удалить строки? - PullRequest
0 голосов
/ 10 сентября 2018

Я создаю MLDataTable из .csv-файла и хотел бы удалить некоторые строки, то есть все строки, в которых конкретный столбец имеет конкретное значение - возможно ли это?

1 Ответ

0 голосов
/ 13 октября 2018

Я знаю, что несколько опоздал с ответом, но, надеюсь, кто-то найдет его полезным.

Вы не можете удалить строки из данной таблицы на месте, но вы можете создать новую таблицу с отфильтрованными строками.

Вот пример таблицы:

let employeesDict: [String: MLDataValueConvertible] = [
    "First Name": ["Alice", "Bob", "Charlie", "Dave", "Eva"],
    "Years of experience": [10, 1, 8, 5, 3],
    "Gender": ["female", "male", "male", "male", "female"],
]

let employeesTable = try! MLDataTable(dictionary: employeesDict)

Фильтрация достигается путем передачи экземпляра MLDataColumn<Bool> в оператор индекса таблицы. Apple называет это «маской строки». Вот маска строки для фильтрации женских экземпляров, созданных вручную:

let maleEmployeesMaskByHand = MLDataColumn([false, true, true, true, false])

Передача его в качестве аргумента в оператор индекса employeesTable приводит к следующей таблице:

let maleEmployeesTable = employeesTable[maleEmployeesMaskByHand]
print(maleEmployeesTable)
+----------------+----------------+---------------------+
| Gender         | First Name     | Years of experience |
+----------------+----------------+---------------------+
| male           | Bob            | 1                   |
| male           | Charlie        | 8                   |
| male           | Dave           | 5                   |
+----------------+----------------+---------------------+

Вот еще один способ создать ту же маску строки:

let genderColumn: MLDataColumn<String> = employeesTable["Gender"]
let maleEmployeesMask = genderColumn != "female"
print(employeesTable[maleEmployeesMask])

Сначала извлекается нужный столбец, а затем - благодаря перегрузке оператора - строится маска строки, применяя оператор != ко всему столбцу.

Вот способ добиться того же в одной строке:

print(employeesTable[ employeesTable["Gender"] != "female" ])

Ссылка на соответствующую документацию: https://developer.apple.com/documentation/createml/mldatatable/3006094-subscript

...