py-datatable 'in' 运算符?

Dal*_*ube 7 python datatable python-3.x py-datatable

我无法in使用预定义的项目列表执行标准操作。我正在寻找做这样的事情:

# 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,:]

Run Code Online (Sandbox Code Playgroud)

此示例导致错误:

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

不幸的是,似乎没有用于in操作的内置对象。我想使用类似于%in%R 语言原生的运算符之类的东西。有没有什么方法可以在python中完成这个?

我可以通过使用多个“等于”运算符来采用这种方法,但是当您要考虑大量项目时,这很不方便:

df[(f.V1 == 'A') | (f.V1 == 'B'),:]
Run Code Online (Sandbox Code Playgroud)

数据表 0.10.1
蟒蛇 3.6

mya*_*cia 6

你也可以试试这个:

首先导入所有必要的包,

import datatable as dt
from datatable import by,f,count
import functools
import operator
Run Code Online (Sandbox Code Playgroud)

创建示例数据表:

DT = dt.Frame(V1=['A','B','C','D','E','B','A'], V2=[1,2,3,4,5,6,7])
Run Code Online (Sandbox Code Playgroud)

列出要在观察结果中过滤的值,在您的情况下是

sel_obs = ['A','B']
Run Code Online (Sandbox Code Playgroud)

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

filter_rows = functools.reduce(operator.or_,(f.V1==obs for obs in sel_obs))
Run Code Online (Sandbox Code Playgroud)

最后在数据表上应用上面创建的过滤器

DT[fil_rows,:]
Run Code Online (Sandbox Code Playgroud)

它的输出为-

Out[6]: 
   | V1  V2
-- + --  --
 0 | A    1
 1 | B    2
 2 | B    6
 3 | A    7

[4 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)

您可以使用运算符来进行不同类型的过滤。

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


ira*_*ira 6

事实证明,当您将表达式列表传递给 python 时datatable,它会将它们计算为or.

所以你可以这样做:

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],:]
Run Code Online (Sandbox Code Playgroud)

请注意,对此有一些注意事项:文档中没有描述它,我绝对不知道它是否总是有效。此外,它也只能过滤一列 - 如果您尝试过滤列表V1==A or V2==1方法会创建重复项的行。

如果您需要进行一些更高级的过滤,您可以调整列表中的过滤表达式,例如:

df[([(datatable.f.V1 == i) & (datatable.f.V2 >= 2) for i in items]),:]
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这将仅返回示例中的第二行。