因为int类型不支持NaN,astype(int)遇缺失值会报ValueError;应先用pd.to_numeric(errors='coerce')转float64保留NaN,再astype("Int64")转可空整型。

为什么 astype(int) 直接报错
因为 Pandas 默认不允许把 NaN(或 None)转成 int——原生 Python 的 int 类型不支持缺失值,而 astype(int) 会尝试用底层 NumPy 的 int64,它同样不能存 NaN。一遇到空值就抛 ValueError: Cannot convert non-finite values (NA, NaN, INF) to integer。
用 pd.Int64Dtype() 启用可空整数类型
这是 Pandas 0.24+ 提供的官方解法:用带大小写的 Int64Dtype(注意首字母大写、末尾大写 D),它基于 pd.NA,能安全容纳缺失值。
实操建议:
- 写成
df["col"].astype("Int64")(字符串形式更简洁)或df["col"].astype(pd.Int64Dtype()) - 别用
"int64"(小写)或np.int64,它们都不支持NA - 转换后该列 dtype 显示为
Int64(首字母大写),不是int64 - 后续做算术运算时,含
NA的结果自动为NA,行为符合直觉
示例:
df = pd.DataFrame({"x": [1, 2, None, 4]})
df["x"] = df["x"].astype("Int64") # 成功,df["x"].dtype → Int64
如果必须用传统 int64,先填再转
某些下游系统(如数据库写入、老版本 NumPy)不认 Int64,这时得退回到原始整数类型。但填法很关键:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 避免用
.fillna(0)硬填——0 可能是有效业务值,会污染数据语义 - 优先用
.fillna(method="bfill")或.fillna(method="ffill")做前后向填充(适合时间序列或有序数据) - 若必须填具体数,至少加注释说明填充值含义,比如
.fillna(-999, inplace=True)并确保下游约定 -999 表示“未知” - 填完再调
.astype("int64"),否则仍会报错
别忽略 float 列隐式转整数的风险
常见坑:读 CSV 时数字列含空值,Pandas 自动设为 float64(因 float 支持 NaN)。你直接 .astype(int) 会失败;而如果先 .astype(int) 失败后改用 .astype("Int64"),要注意 float 值是否含小数——2.0 可转,但 2.5 会报 Cannot convert non-integer float values。
稳妥做法:
- 先用
pd.api.types.is_float_dtype(df["col"])检查类型 - 对 float 列,显式四舍五入或截断:
df["col"].round().astype("Int64")或df["col"].fillna(pd.NA).apply(lambda x: int(x) if pd.notna(x) else pd.NA).astype("Int64")
真正麻烦的是那些本该是整数、却被读成 float 的列——空值只是表象,根源常在数据源或读取参数(比如 pd.read_csv(..., dtype={"col": "Int64"}) 能从源头规避)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










