如何基于数据类型删除DataFrame列?移除object类型列报错求助
解决Pandas删除Object类型字段保留数值型字段的问题
首先,咱们来拆解下你代码里的几个关键问题,这就是导致报错和功能失效的原因:
data.values.type是错误写法:data.values返回的是numpy数组,它的类型属性是dtype,而且你要检查的是单列的数据类型,不是整个数组的类型,应该用data[cols].dtype来获取当前列的类型。drop方法缺少核心参数:你只指定了axis=1,但没告诉Pandas要删除哪一列,必须把当前列cols作为第一个参数传进去。inplace=True的误用:当设置inplace=True时,drop会直接修改原DataFrame,不会返回新对象,这时候把它赋值给numdata会得到None,完全不是你想要的结果。
方法1:更高效的Pandas原生写法(推荐,无需手动循环)
Pandas自带的select_dtypes方法可以直接筛选指定类型的列,比手动循环简洁高效太多,特别适合重复在不同数据集上执行:
# 保留所有数值型字段(int、float、bool等) numdata = data.select_dtypes(include=['number'])
如果你想明确排除object类型,也可以这么写:
numdata = data.select_dtypes(exclude=['object'])
一行代码就能搞定,可读性和执行效率都拉满。
方法2:修正后的循环写法
如果你坚持想用循环实现,这里是调整后的可用代码:
# 先复制原数据,避免循环中修改原数据导致迭代异常 numdata = data.copy() for cols in data.columns: # 检查当前列是否为object类型 if data[cols].dtype == object: # 删除目标列,赋值给新变量保留原数据 numdata = numdata.drop(cols, axis=1)
这里做了几个关键修正:
- 遍历
data.columns而非直接遍历data,逻辑更清晰 - 用
data[cols].dtype正确获取列类型 - 先复制原数据,循环中修改副本,避免迭代过程中修改原数据引发的问题
补充说明
select_dtypes的include参数支持多种类型,比如['int64', 'float64']可以更精准筛选数值类型- 布尔型(bool)默认属于数值型范畴,如果不想保留,可以单独添加
exclude=['bool']或者指定具体的数值类型
内容的提问来源于stack exchange,提问作者Nick Duddy
相关产品推荐
相关产品推荐

