如何从 pydatatable 数据框中删除列列表?

How to remove a list of columns from pydatatable dataframe?

我创建了一个数据表框架:

comidas_gen_dt = dt.Frame({
    'country':list('ABCDE'),
    'id':[1,2,3,4,5],
    'egg':[10,20,30,5,40],
    'veg':[30,40,10,3,5],
    'fork':[5,10,2,1,9],
    'beef':[90,50,20,None,4]})

我已经创建了一个自定义函数 select 框架 DT 中所需列的列表,如

def pydt_select_cols(DT, *rmcols):
    return DT[:, *dt_cols]

因此,这是从 DT 中删除列的推荐语法:

DT[:, f[:].remove([f.a, f.b, f.c])

按照上面的 DT 语法,我创建了另一个自定义函数来将列列表保留为

def pydt_remove_cols(DT, *rmcols):
    dt_cols = [*rmcols]
    return DT[:, f[:].remove(dt_cols)]

我正在执行函数

pydt_remove_cols(comidas_gen_dt, 'id', 'country', 'egg')

它抛出错误

TypeError: Computed columns cannot be used in .remove()

你能帮我看看如何继续吗?

从框架中删除列(或行)很容易:采用您通常用于 select 这些列的任何语法,然后附加 python del 关键字。

因此,如果要删除列 'id''country''egg'、运行

>>> del comidas_gen_dt[:, ['id','country','egg']]
>>> comidas_gen_dt
   | veg  fork  beef
-- + ---  ----  ----
 0 |  30     5    90
 1 |  40    10    50
 2 |  10     2    20
 3 |   3     1    NA
 4 |   5     9     4

[5 rows x 3 columns]

如果您想保持原始框架不变,然后 select 一个新的框架并删除一些列,那么最简单的方法是先复制框架,然后使用 del 操作:

>>> DT = comidas_gen_dt.copy()
>>> del DT[:, columns_to_remove]

(注意 .copy() 进行浅拷贝,即其成本通常可以忽略不计)。

您也可以使用 f[:].remove() 方法。有点奇怪,它没有按照您编写的方式工作,但是从字符串列表到 f-符号列表非常简单:

def pydt_remove_cols(DT, *rmcols):
    return DT[:, f[:].remove([f[col] for col in rmcols])]

这里我使用了 f.Af["A"] 相同的事实,其中内部字符串 "A" 也可以替换为任何变量。