pandas中select_dtypes(include=['number'])未选中第一列的原因排查
问题分析:为何
select_dtypes未选中列名1的数值列? 你遇到的问题核心是混淆了「列名的类型」和「列数据的类型」——select_dtypes(include=['number'])筛选的是列中存储的数据的类型,而不是列名本身的类型,这就是为什么你明明确认列名1是int类型,却没被选中的原因。
具体原因拆解
从你的执行结果来看:
- 执行
df[df.select_dtypes(include=['number']).columns] *= 1000后,列1的数值(105、18)没有变化,而列2、3、4的数值都被放大了1000倍 - 查看选中列时的结果里出现
category列,这显然是显示误差,但核心问题还是列1未被选中
这说明列1的数据类型并不是数值型(int/float),而是object(字符串类型)。大概率是你读取Excel时,该列在原文件中存在文本格式的单元格(比如空值、带特殊字符的内容,或者Excel设置了文本格式),导致pandas将整列识别为object类型,而select_dtypes(include=['number'])会自动排除这类列。
验证方法
先打印出每一列的数据类型,而不是列名的类型:
print(df.dtypes)
你会发现列1的dtype是object,而列2、3、4是int64或float64。
解决方案
- 将列
1转换为数值类型:
使用pd.to_numeric强制转换,errors='coerce'会把无法转换的内容转为NaN(如果有需要可以后续处理):df['1'] = pd.to_numeric(df['1'], errors='coerce') - 重新执行乘法操作:
此时再运行你的代码,列1就会被select_dtypes选中,数值也会被乘以1000:df[df.select_dtypes(include=['number']).columns] *= 1000
额外提示
以后使用select_dtypes时,一定要注意它的判断依据是列数据的类型,和列名的类型完全无关。如果需要根据列名筛选,应该用列名的条件判断(比如[col for col in df.columns if isinstance(col, int)]),但这和数据类型筛选是两个不同的逻辑。
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

