py-datatable 'in' 运算符?
py-datatable 'in' operator?
我无法使用预定义的项目列表执行标准 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,:]
此示例导致错误:
TypeError: A boolean value cannot be used as a row selector
不幸的是,in
操作似乎没有内置对象。我想使用 R 语言原生的 %in%
运算符之类的东西。 在python中有什么方法可以做到这一点吗?
我可以通过使用多个 'equals' 运算符来采用这种方法,但是当您要考虑大量项目时,这会很不方便:
df[(f.V1 == 'A') | (f.V1 == 'B'),:]
数据表 0.10.1
python 3.6
我没有在 pydatatable
中找到 in
函数;但是,您的用例有一个黑客:
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。我在文档中也找不到这个函数。希望随着时间的推移,文档会得到改进,并且还会包含更多功能。
你也可以试试这个:
首先将所有必要的包导入为,
import datatable as dt
from datatable import by,f,count
import functools
import operator
创建示例数据表:
DT = dt.Frame(V1=['A','B','C','D','E','B','A'], V2=[1,2,3,4,5,6,7])
列出要在观察中过滤的值,在您的情况下是
sel_obs = ['A','B']
现在使用 funtools 和运算符模块创建一个过滤器表达式,
filter_rows = functools.reduce(operator.or_,(f.V1==obs for obs in sel_obs))
最后在数据表上应用上面创建的过滤器
DT[fil_rows,:]
它的输出为-
Out[6]:
| V1 V2
-- + -- --
0 | A 1
1 | B 2
2 | B 6
3 | A 7
[4 rows x 2 columns]
您可以使用运算符进行不同类型的过滤。
@sammyweemy 的解决方案也应该有效。
事实证明,当您将表达式列表传递给 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],:]
请注意,对此有一些注意事项:它没有在文档中描述,我绝对不知道它是否总是有效。此外,它也只能过滤一列 - 如果您尝试过滤 V1==A or V2==1
列表方法会创建重复项的行。
如果你需要做一些更高级的过滤,你可以调整列表中的过滤表达式,例如:
df[([(datatable.f.V1 == i) & (datatable.f.V2 >= 2) for i in items]),:]
这将 return 正如预期的那样只是示例的第二行。
我无法使用预定义的项目列表执行标准 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,:]
此示例导致错误:
TypeError: A boolean value cannot be used as a row selector
不幸的是,in
操作似乎没有内置对象。我想使用 R 语言原生的 %in%
运算符之类的东西。 在python中有什么方法可以做到这一点吗?
我可以通过使用多个 'equals' 运算符来采用这种方法,但是当您要考虑大量项目时,这会很不方便:
df[(f.V1 == 'A') | (f.V1 == 'B'),:]
数据表 0.10.1
python 3.6
我没有在 pydatatable
中找到 in
函数;但是,您的用例有一个黑客:
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。我在文档中也找不到这个函数。希望随着时间的推移,文档会得到改进,并且还会包含更多功能。
你也可以试试这个:
首先将所有必要的包导入为,
import datatable as dt
from datatable import by,f,count
import functools
import operator
创建示例数据表:
DT = dt.Frame(V1=['A','B','C','D','E','B','A'], V2=[1,2,3,4,5,6,7])
列出要在观察中过滤的值,在您的情况下是
sel_obs = ['A','B']
现在使用 funtools 和运算符模块创建一个过滤器表达式,
filter_rows = functools.reduce(operator.or_,(f.V1==obs for obs in sel_obs))
最后在数据表上应用上面创建的过滤器
DT[fil_rows,:]
它的输出为-
Out[6]:
| V1 V2
-- + -- --
0 | A 1
1 | B 2
2 | B 6
3 | A 7
[4 rows x 2 columns]
您可以使用运算符进行不同类型的过滤。
@sammyweemy 的解决方案也应该有效。
事实证明,当您将表达式列表传递给 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],:]
请注意,对此有一些注意事项:它没有在文档中描述,我绝对不知道它是否总是有效。此外,它也只能过滤一列 - 如果您尝试过滤 V1==A or V2==1
列表方法会创建重复项的行。
如果你需要做一些更高级的过滤,你可以调整列表中的过滤表达式,例如:
df[([(datatable.f.V1 == i) & (datatable.f.V2 >= 2) for i in items]),:]
这将 return 正如预期的那样只是示例的第二行。