如何过滤在 Pydatatable 框架的 I 表达式中传递的多个值的观察?
How to filter observations for the multiple values passed in the I expression of Pydatatable frame?
我有一个包含两列的数据框,如下所示,
DT_EX = dt.Frame({'film':['Don','Warriors','Dragon','Chicago','Lion','Don','Chicago','Warriors'],
'gross':[400,500,600,100,200,300,900,1000]})
在第一种情况下,我想过滤电影是 Don 或 Chicago 的观察结果,如下面的代码所示,
DT_EX[((f.film=="Don") | (f.film=="Chicago")),:]
稍后我将对 3 个值应用过滤器,
DT_EX[((f.film=="Don") | (f.film=="Chicago") | (f.film=="Lion")),:]
过滤超过5个或10个值的情况下,我们要为这么多值做一个逻辑表达式,这肯定是一个耗时的任务。
是否有任何数据表方法可以更快地完成它?比如在 R data.table
.
中有 %in%
%chin%
种过滤选项
Python 等价于 R 的 %in
运算符被简单地称为 in
。不幸的是,这个运算符还没有在数据表中实现,相关的功能请求是https://github.com/h2oai/datatable/issues/699。
与此同时,我建议使用带有 or_
运算符的标准 reduce
仿函数:
>>> 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]
我有一个包含两列的数据框,如下所示,
DT_EX = dt.Frame({'film':['Don','Warriors','Dragon','Chicago','Lion','Don','Chicago','Warriors'],
'gross':[400,500,600,100,200,300,900,1000]})
在第一种情况下,我想过滤电影是 Don 或 Chicago 的观察结果,如下面的代码所示,
DT_EX[((f.film=="Don") | (f.film=="Chicago")),:]
稍后我将对 3 个值应用过滤器,
DT_EX[((f.film=="Don") | (f.film=="Chicago") | (f.film=="Lion")),:]
过滤超过5个或10个值的情况下,我们要为这么多值做一个逻辑表达式,这肯定是一个耗时的任务。
是否有任何数据表方法可以更快地完成它?比如在 R data.table
.
%in%
%chin%
种过滤选项
Python 等价于 R 的 %in
运算符被简单地称为 in
。不幸的是,这个运算符还没有在数据表中实现,相关的功能请求是https://github.com/h2oai/datatable/issues/699。
与此同时,我建议使用带有 or_
运算符的标准 reduce
仿函数:
>>> 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]