用"int64"(大写i)指定dtype可读入含缺失值的整数列,避免float64升格;已有float64列可用convert_dtypes()无损转为int64;pd.na参与运算返回na而非false,筛选需显式处理。

直接用 pd.read_csv() 读入含缺失值的整数列,会自动变成 float64 类型——这不是 bug,是 Pandas 为兼容 np.nan 做的强制升格。后续想转回整数,.astype(int) 会报错;想保留缺失又不丢精度,得绕开默认行为。
读 CSV 时就指定 nullable integer 类型
关键在 dtype 参数传字符串 "Int64"(注意大写 I),不是 "int64"。它对应 pd.Int64Dtype(),底层用 pd.NA 表示缺失,不依赖 np.nan。
-
"Int64"必须在read_csv()时声明,比如dtype={"user_id": "Int64", "score": "Int64"} - 如果列里混了字符串(如
"N/A"),先用na_values=["N/A"]和keep_default_na=False让它们变pd.NA,再配合"Int64"才能成功解析 - 别写成
dtype={"col": int}或"int",这会触发 Python 原生类型转换,遇到None直接崩
已有 float64 列含 NaN,怎么“抢救”成可空整数
别硬 cast,用 .convert_dtypes()。它会扫描非缺失值:只要全是 1.0、2.0 这种能无损转整数的浮点数,就自动换成 Int64。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 调用前确保
NaN是标准np.nan(不是字符串"NaN"),否则convert_dtypes()会跳过该列 - 默认启用
convert_integer=True,但若列里有1.5这类小数,它会保留为Float64(带缺失的浮点类型) - 对
object类型列(比如混了"1"和None),它不会强转,需先用pd.to_numeric(..., errors="coerce")清洗再试
用布尔索引或计算时踩 pd.NA 的坑
pd.NA 不是布尔值,也不是数字,参与比较或算术运算会返回 pd.NA,不是 True/False 或标量结果。
-
df["age"] == 25对含<na></na>的列,结果中对应位置是<na></na>,不是False—— 因为“未知是否等于 25”不等于“不等于 25” - 做
.loc筛选前,必须显式处理:mask = df["age"].fillna(False) == 25或mask = df["age"].dropna().eq(25) -
.sum()、.mean()会自动跳过<na></na>,但.count()返回非缺失个数,不是len()—— 拿来算占比时别混淆
最易忽略的是:同一列在不同阶段可能有不同缺失语义。比如 "-" 在电话列代表“未提供”,在年龄列却可能是录入错误。类型修复只是基础,业务含义对齐才是清洗闭环的关键。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










