3

我有一个数据表框架创建为:

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]})

我创建了一个自定义函数来从框架中选择所需列的列表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:计算列不能用于.remove()

你能帮我怎么做吗?

4

1 回答 1

3

从 Frame 中删除列(或行)很容易:采用通常用于选择这些列的任何语法,然后附加 pythondel关键字。

因此,如果要删除列'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]

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

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

(请注意,这.copy()是一个浅拷贝,即它的成本通常可以忽略不计)。

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

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

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

于 2020-05-22T17:44:33.460 回答