如何基于数据类型取消选择PyDatatable中的整数与布尔类型列?
解决datatable中按类型移除列的问题
嘿,我明白你遇到的问题了——f[:].remove()确实不能直接传入数据类型来删除列,因为这个方法只接受**列引用(比如f.x、f.v)**或者列名,不支持直接用stype作为参数。不过我们可以换个思路,先筛选出想要保留的列(也就是非int32和bool8类型的列),再用这些列来索引数据表。
方法一:通过列名筛选
先遍历所有列名,检查每列的类型是否属于要排除的类型,收集保留的列名后再选择:
from datatable import dt DT_X = dt.Frame({'x':[1,2,3,4,5], 'y':[0.1,0.5,0.9,1.5,4.3], 'z':['a','b','c','d','e'], 'u':[True,False,True,False,False], 'v':[10,20,30,40,50], 'r':[4.5,5.5,6.5,8.5,10.5] }) # 收集非int32和bool8类型的列名 keep_cols = [col for col in DT_X.names if DT_X.stypes[DT_X.names.index(col)] not in (dt.int32, dt.bool8)] # 选择这些列 filtered_dt = DT_X[:, keep_cols]
方法二:通过列位置筛选
如果更习惯用列的索引位置来操作,可以这样做:
# 获取要保留的列的索引位置 keep_positions = [i for i, stype in enumerate(DT_X.stypes) if stype not in (dt.int32, dt.bool8)] # 按位置选择列 filtered_dt = DT_X[:, keep_positions]
方法三:用datatable的列表达式(更原生)
如果你想保持datatable的链式风格,也可以用列表推导式生成列表达式:
from datatable import f filtered_dt = DT_X[:, [f[col] for col in DT_X.names if DT_X.stypes[DT_X.names.index(col)] not in (dt.int32, dt.bool8)]]
验证结果
执行以上任意一种方法后,filtered_dt的列会是y(float64)、z(str32)、r(float64),正好排除了所有int32和bool8类型的列,完全符合你的需求。
内容的提问来源于stack exchange,提问作者myamulla_ciencia
相关产品推荐
相关产品推荐

