首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >py-datatable 'in‘操作符?

py-datatable 'in‘操作符?
EN

Stack Overflow用户
提问于 2020-06-14 22:06:39
回答 3查看 410关注 0票数 7

我无法使用预定义的项目列表执行标准的in操作.我想做这样的事情:

代码语言:javascript
复制
# Construct a simple example frame
from datatable import *
df = Frame(V1=['A','B','C','D'], V2=[1,2,3,4])

# Filter frame to a list of items (THIS DOES NOT WORK)
items = ['A','B']
df[f.V1 in items,:]

此示例将导致错误:

TypeError: A boolean value cannot be used as a row selector

不幸的是,in操作似乎没有内置对象。我想使用类似于R语言固有的%in%运算符的东西。有什么方法可以在python中实现这一点吗?

我可以通过使用多个“相等”操作符来采用这种方法,但是当您想要考虑大量的项时,这是不方便的:

代码语言:javascript
复制
df[(f.V1 == 'A') | (f.V1 == 'B'),:]

数据表0.10.1

python 3.6

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-16 02:55:36

你也可以试试这个:

首先导入所有必要的包,

代码语言:javascript
复制
import datatable as dt
from datatable import by,f,count
import functools
import operator

创建一个示例数据表:

代码语言:javascript
复制
DT = dt.Frame(V1=['A','B','C','D','E','B','A'], V2=[1,2,3,4,5,6,7])

列出要在观察中筛选的值,在您的情况下是

代码语言:javascript
复制
sel_obs = ['A','B']

现在使用funtools和运算符模块创建过滤器表达式,

代码语言:javascript
复制
filter_rows = functools.reduce(operator.or_,(f.V1==obs for obs in sel_obs))

最后,在datatable上应用上面创建的过滤器。

代码语言:javascript
复制
DT[fil_rows,:]

其输出为-

代码语言:javascript
复制
Out[6]: 
   | V1  V2
-- + --  --
 0 | A    1
 1 | B    2
 2 | B    6
 3 | A    7

[4 rows x 2 columns]

你可以和操作人员一起玩来做不同类型的过滤。

@sammyweemy的解决方案也应该有效。

票数 6
EN

Stack Overflow用户

发布于 2021-04-29 16:32:21

结果是,当您将表达式列表传递给python datatable时,它将将它们计算为or

所以你可以这么做:

代码语言:javascript
复制
import datatable
df = datatable.Frame(V1=['A','B','C','D'], V2=[1,2,3,4])

items = ['A','B']
df[[datatable.f.V1 == i for i in items],:]

请注意,对此有一些注意事项:在文档中没有描述它,而且我完全不知道它是否总是工作的。此外,它也只对一个列进行过滤--如果您试图过滤V1==A or V2==1中的行,则使用list的方法将创建重复的列。

如果您需要进行一些更高级的筛选,您只需调整列表中的筛选表达式,如:

代码语言:javascript
复制
df[([(datatable.f.V1 == i) & (datatable.f.V2 >= 2) for i in items]),:]

它将像预期的那样只返回示例中的第二行。

票数 6
EN

Stack Overflow用户

发布于 2020-06-15 09:40:49

我还没有在in中找到一个pydatatable函数;但是,您的用例中有一个黑客:

代码语言:javascript
复制
items = ['A','B']
regex = f"{'|'.join(items)}"
df[f.V1.re_match(regex),:]


   V1   V2
  ▪▪▪▪  ▪▪▪▪
0   A   1
1   B   2
2 rows × 2 columns

这是对另一个问题的回答:link。我在文档中也找不到这个函数。希望随着时间的推移,文档将得到改进,还将包含更多的功能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62378782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档