Как отфильтровать наблюдения для нескольких значений, переданных в I-выражении Pydatatable фрейма? - PullRequest
1 голос
/ 29 апреля 2020

У меня есть фрейм данных с двумя столбцами, как показано ниже,

DT_EX = dt.Frame({'film':['Don','Warriors','Dragon','Chicago','Lion','Don','Chicago','Warriors'],'gross':[400,500,600,100,200,300,900,1000]})

Здесь в первом случае я хотел бы отфильтровать наблюдения, фильм которых Дон или Чика go, как написано в коде ниже,

DT_EX[((f.film=="Don") | (f.film=="Chicago")),:]

Через секунду я бы применил фильтр для 3 значений как,

DT_EX[((f.film=="Don") | (f.film=="Chicago") | (f.film=="Lion")),:]

В случае фильтрации более 5 или 10 значений, мы должны составить логическое выражение для этих многих значений, и это определенно было бы трудоемкой задачей.

Есть ли какой-нибудь подходящий способ сделать это быстрее? как у нас есть варианты фильтрации% in%% chin%, доступные в Ratatable.

1 Ответ

1 голос
/ 29 апреля 2020

Python эквивалент оператора R's %in называется просто in. К сожалению, этот оператор еще не реализован в datatable, запрос соответствующей функции: https://github.com/h2oai/datatable/issues/699.

. Между тем, я бы рекомендовал использовать стандартный функтор reduce с оператором or_:

>>> import functools
>>> import operator
>>>
>>> films = ['Lion', 'Chicago', 'Don']
>>> filter = functools.reduce(operator.or_, (f.film == item for item in films))
>>> DT_EX[filter, :]
   | film     gross
-- + -------  -----
 0 | Don        400
 1 | Chicago    100
 2 | Lion       200
 3 | Don        300
 4 | Chicago    900

[5 rows x 2 columns]
...