fillna()后整数列变float是因为np.nan是浮点型,触发pandas类型升格;改用可空int64类型或convert_dtypes()可保持整数语义。

为什么 fillna() 后整数列变成了 float?
因为 Pandas 默认用 np.nan 填充缺失值,而 np.nan 是浮点类型,整数列一旦遇到 np.nan 就会自动升格为 float64。这不是 bug,是 Pandas 的类型安全机制——它不支持原生整数型的空值。
用 Int64(首字母大写)替代 int64
Pandas 自 0.24 起提供可空整数类型 Int64(注意是大写 I),底层用 pd.NA 表示缺失,而非 np.nan,因此能保持整数语义。
实操建议:
- 读取数据时就指定类型:
df = pd.read_csv("data.csv", dtype={"age": "Int64"}) - 已有列转类型:
df["age"] = df["age"].astype("Int64")(会把原np.nan自动转为pd.NA) - 填充空值用
fillna()时,填整数(如0或-1)仍保持Int64;但填pd.NA或不填,也维持类型不变
fillna() + convert_dtypes() 组合更省心
如果你不确定原始类型、也不愿逐列声明,可以用 convert_dtypes() 让 Pandas 自动推断最优可空类型(包括 Int64, string, boolean 等)。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
常见用法:
- 全表统一转换:
df = df.convert_dtypes(dtype_backend="numpy_nullable")(推荐,明确启用可空类型后端) - 再做填充:
df["age"] = df["age"].fillna(0)→ 结果仍是Int64 - 注意:旧版本("numpy",
convert_dtypes()可能仍返回object类型,务必加dtype_backend="numpy_nullable"
别在 dropna() 后硬转 int64
有人习惯先删空行再强转:df["age"].dropna().astype("int64"),这看似恢复了整数类型,但实际丢失了原始索引对齐关系——返回的是新 Series,长度变短,无法直接赋回原 DataFrame。
正确做法:
- 用布尔索引原地修改:
mask = df["age"].isna(); df.loc[~mask, "age"] = df.loc[~mask, "age"].astype("int64"),但这样只处理非空部分,空位仍是NaN,类型仍会退化 - 不如一步到位用
Int64—— 它天然兼容空值,无需回避
最易被忽略的一点:Pandas 的 Int64 是 nullable 类型,和 Python 原生 int 不同,参与算术运算时遇到 pd.NA 会传播为 pd.NA,不是报错。这点必须提前意识到,否则调试时会困惑“为什么结果突然全是 <na></na>”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










