首页 > 解决方案 > 如何过滤Pydatatable框架的I表达式中传递的多个值的观察?

问题描述

我有一个包含两列的数据框,如下所示,

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 中有一些%in% %chin%过滤选项一样data.table

标签: pythonpy-datatable

解决方案


R 运算符的 Python 等价物%in被简单地称为in. 不幸的是,这个算子还没有在数据表中实现,相关的功能请求是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]

推荐阅读