select_dtypes只识别pandas定义的dtype字符串或numpy类型对象,不接受Python内置类型如int或模糊字符串'int';正确写法是include=['int64','int32']或include='number'。

select_dtypes只认pandas内置的dtype,不是Python类型名
很多人写 select_dtypes(include=int) 或 select_dtypes(include='int') 发现没效果,是因为 select_dtypes 不接受 Python 内置类型(如 int、str)或模糊字符串(如 'int'),它只识别 pandas 明确定义的 dtype 字符串或 numpy 类型对象。
- 正确写法是
select_dtypes(include=['int64', 'int32'])或select_dtypes(include='number') -
'number'是便捷别名,覆盖所有数值型(int64、float64、uint8等) -
'object'对应字符串列(但也会包含 list、dict 等混合类型,需谨慎) - 用
np.number、np.object_也可以,但需先import numpy as np
想选“看起来像数字”的列?不能只靠select_dtypes
select_dtypes 看的是底层 dtype,不是数据内容。比如一列全是 '1'、'2' 字符串,dtype 是 object,select_dtypes(include='number') 就完全抓不到它——它根本不是数值类型。
- 先用
df.dtypes确认真实 dtype,别凭肉眼判断 - 若需按语义筛选(如“能转成数字的列”),得配合
pd.to_numeric(..., errors='coerce')+notna()检查 - 对疑似数值的
object列,可逐列尝试转换并统计非空比例,再决定是否保留
exclude参数容易误用:它不是“排除某几列”,而是“排除某类dtype”
写 select_dtypes(exclude=['category']) 的意思是“去掉所有 category 类型的列”,不是“去掉列名叫 'category' 的那列”。如果误以为它是按列名过滤,就会漏掉目标列或删错列。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
include和exclude是互斥逻辑,不建议同时用(行为可能反直觉) - 想排除特定列名,用
df.drop(columns=['col_a', 'col_b'])更直接 -
select_dtypes(include='number').select_dtypes(exclude=['float64'])这种链式调用虽可行,但可读性差,不如一步写全:select_dtypes(include=['int64', 'int32', 'uint8'])
性能敏感时注意:select_dtypes本身很快,但后续操作可能拖慢
select_dtypes 底层是 dtype 映射查找,几乎无计算开销。真正影响性能的是你接下来对返回子集做的操作——尤其是对大量 object 列做字符串方法(如 .str.contains())或反复 apply。
- 如果只要列名,用
df.select_dtypes(...).columns.tolist(),别留着整个 DataFrame - 对筛选出的数值列做聚合(如
.sum()),比在全量 DataFrame 上用numeric_only=True更快且更可控 - 注意:
select_dtypes(include='number')会包含datetime64(pandas 把它归为 numeric),如不需要,显式排除:exclude=['datetime64', 'timedelta64']
实际 dtype 判断比表面看到的更微妙,比如 Int64(nullable int)和 int64 是不同的 dtype,select_dtypes(include='integer') 才能同时覆盖二者——这种细节不看 df.dtypes 输出,很容易踩空。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










