直接用 astype(int) 会报错因为 pandas 默认整型不支持 nan;应改用 astype('int64'),它原生支持 pd.na,自动兼容 np.nan,且无需预处理。

为什么直接用 astype(int) 会报错
因为 pandas 默认的整型(如 int64)不支持 NaN,而 NaN 是浮点类型。一旦列里有 NaN,df['col'].astype(int) 会直接抛出 ValueError: Cannot convert non-finite values (NA, NaN, Inf) to integer。
用 Int64(大写 I)替代 int64 是最安全的选择
pandas 提供了可空整型(nullable integer dtype),即 Int64、Int32 等(首字母大写)。它原生支持 pd.NA(注意不是 np.nan,但 pandas 会自动转换)。
实操建议:
- 优先使用
df['col'] = df['col'].astype('Int64')—— 这是目前最干净、无需预处理的方式 - 如果原始
NaN是np.nan,pandas 会在转换时自动转为pd.NA,不会报错 - 转换后该列的 dtype 是
Int64(注意大小写),可用df['col'].dtype验证 - 避免混用
np.nan和pd.NA:后续计算中,pd.NA传播更一致(比如pd.NA + 1还是pd.NA)
如果必须转成普通 int(比如导出到不支持 pd.NA 的系统)
就得显式处理缺失值,不能跳过。常见做法是填充或丢弃,但需根据业务决定:
- 填零:
df['col'].fillna(0).astype(int)—— 仅当 0 是合理默认值时才用 - 填特定哨兵值(如 -999):
df['col'].fillna(-999).astype(int),但要确保下游能识别该含义 - 用
convert_dtypes()自动推断最优类型:df = df.convert_dtypes(dtype_backend='pandas'),它会把含NaN的数字列转成Int64或string,适合探索性清洗 - 千万别用
df['col'].dropna().astype(int)后再赋值回去——这会破坏行对齐,导致数据错位
性能与兼容性要注意的点
Int64 列比 int64 占更多内存、运算稍慢(因额外存储缺失标记),但在大多数分析场景下可忽略;真正要注意的是生态兼容性:
- 某些老版本 sklearn 或数据库驱动不认
Int64,报错类似TypeError: not supported between instances of 'Int64Dtype' and 'str' - 写入 CSV 时,
pd.NA默认输出为""或NaN,可通过na_rep参数控制:df.to_csv(..., na_rep='NULL') - 和 numpy 交互时,
df['col'].to_numpy()会返回object数组(含pd.NA),不是纯 int 数组;需要纯数值请先fillna()再转
df['col'].isna().mean()。比例高却硬填 0,可能比保留 Int64 更误导分析。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











