Int64等可空整数类型是为解决缺失值导致崩溃的硬伤;大写Int64是Pandas支持pd.NA的extension dtype,小写int64是NumPy不支持缺失值的原生类型。

Int64、Int32、UInt8 这些可空整数类型不是“锦上添花”,而是为了解决老版本里一碰缺失值就崩掉的硬伤。
Int64 为什么必须大写 I?
小写 int64 是 NumPy 原生类型,不支持缺失值;大写 Int64 是 Pandas 的 extension dtype,底层用 pd.NA 标记空位,不依赖 np.nan。
- 写成
"int64":遇到None或np.nan→ 自动升格为float64 - 写成
"Int64":同列混入None、np.nan、pd.NA→ 全转成<na></na>,类型稳住 - 容易踩的坑:复制粘贴时漏掉大小写,或误用
pd.Int64Dtype()(带括号)却没传参,会报TypeError: Int64Dtype() takes no arguments
convert_dtypes() 为什么有时失效?
它只对“看起来像整数的 float 列”生效,比如 [1.0, 2.0, np.nan] → 转 Int64;但对 ["1", "2", ""] 或 [1, 2, "missing"] 直接转成 string,不会报错,也不会警告。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 正确做法:读取时就锁死类型
df = pd.read_csv("data.csv", dtype={"id": "Int64", "flag": "boolean"}) - 或统一启用后端再转
df = df.convert_dtypes(dtype_backend="numpy_nullable")
- 别信默认行为:
convert_dtypes()不加dtype_backend参数,旧版本仍可能返回object
fillna() 后类型变 float 的根因是什么?
因为 np.nan 是 float 类型,而 int64 列无法容纳它——Pandas 的类型系统不允许“整数 + NaN”。
立即学习“Python免费学习笔记(深入)”;
- 用
Int64后,fillna(0)返回仍是Int64;填pd.NA也维持类型 - 但若先用
astype("int64")强转含np.nan的列,会直接报ValueError: cannot convert NA to integer - 最容易被忽略的一点:
Int64参与算术运算时,遇到<na></na>会传播<na></na>,不是报错也不是跳过——比如df["a"] + df["b"]中任一为<na></na>,结果整列都是<na></na>
真正关键的不是“能不能用”,而是你得提前决定:这一列的缺失是语义缺失(该有但没采到),还是数据污染(本不该出现)。前者用 Int64 + pd.NA,后者得清洗后再进 pipeline。

















