根据python datatable是否在列表中筛选其行

2024-05-16 12:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉python数据表,下面是我要介绍的tutorial

如何筛选出列表中包含特定列中的值的行

基本上,这就是我正在使用的代码:

    import datatable as dt
    sfr = dt.fread(os.path.join(dirName, 'Results.csv'))

sfr
Out[25]: 
         |       ioid  itemtype  date       itemid           tid  value
-------- + ----------  --------  --------  -------  ------------  -------
       0 |          1         1  7-1-2022     9015           531   0.0283
       1 |          1         1  7-1-2022     9015           532   0.0071
       2 |          1         1  7-1-2022     9016           534   0.0065
       3 |          1         1  7-1-2022     9017          1018   0.0005

我正在努力做到以下几点

ids = [9016, 9017]
sft[dt.f.itemid.isin(ids)]

但是,我无法使语法正常工作

期望输出为:

         |       ioid  itemtype  date       itemid           tid  value
-------- + ----------  --------  --------  -------  ------------  -------
       2 |          1         1  7-1-2022     9016           534   0.0065
       3 |          1         1  7-1-2022     9017          1018   0.0005

Tags: 代码importids列表datevaluedttutorial
1条回答
网友
1楼 · 发布于 2024-05-16 12:31:16

由于Pydatatable不显式支持根据值列表进行过滤(请参见feature request),因此下面的解决方案可能不太直观。尽管如此,它还是通过利用datatable连接函数实现了这种过滤的功能:

ids = [9016, 9017]
f = dt.Frame(itemid = ids)
sfr.key = "itemid"
sfr_filtered = f[:, :, dt.join(sfr)]

这些步骤包括:

  1. 创建一个框架(数据表),其中包含一个与要筛选的列同名的列,并在此框架内存储值列表
  2. 在要过滤的列上设置原始帧的关键帧
  3. 连接帧以使用datatable连接执行筛选

不过这里有一个问题:当前联接有一些限制-它只剩下外部联接,并且联接列(itemid在上面的解决方案中sfr)必须具有唯一的值,否则sfr.key = "itemid"会引发此错误:

ValueError: Cannot set a key: the values are not unique

由于这些强有力的假设,当itemid包含非唯一值时,它将不起作用。在这种情况下,我们将“连接”转过来,并在添加到包含列表的框架的虚拟列上添加额外的筛选器:

ids = [9016, 9017]
f = dt.Frame(itemid = ids, dummy = [0, 0])
f.key = "itemid"
sfr_filtered = sfr[:, :, dt.join(f)][~dt.isna(dt.f.dummy), :]

此解决方案将始终有效,但由于总是连接所有行并进行额外筛选以删除不匹配的行,因此效率明显较低。有关Pydatatable联接的当前状态的更多详细信息,请参见文档here

更新

为了完整性,我添加了另一个(可以说是更直接的)解决方案,该解决方案是Pasha(Pydatatable的创建者和维护者)从this answer借用的:

import functools
import operator

filter = functools.reduce(operator.or_, (dt.f.itemid == id for id in ids))
sfr[filter, :]

在实现此功能请求https://github.com/h2oai/datatable/issues/699之前,上面显示的解决方案之一会根据值列表进行过滤

相关问题 更多 >