python - 如何过滤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
。
解决方案
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]
推荐阅读
- algorithm - 总是选择第二小的元素作为子列表中的枢轴时的快速排序时间复杂度
- c# - 如何在 D:\myfolder\ 中使用 C# 获取名为 something-* 的直接目录列表
- php - 使用 simplehtmldom 进行抓取给了我空的结果
- android-gradle-plugin - 无法解析 ':app@debug/compileClasspath' 的依赖关系:无法解析 com.android.support:multidex:1.0.2
- python - 引用 python 包中的文件
- java - 参数化方法类型在列表中时不起作用
- java - 如何修复 Android Studio 错误“compileDebugAidl”
- php - 在 30 分钟块中显示上午 9 点至下午 5 点 + 阵列以划掉“不可用”时间
- javascript - 为什么在尝试使用标头发布请求时出现错误?
- ruby-on-rails - 设计 Tumblr Omniauth