
本文详解如何使用 pandas 的 .astype() 方法高效、安全地将 DataFrame 中多个特定列的数据类型批量转换为整数,避免 NaN 导致的类型转换错误,并提供可复用的代码范式。
本文详解如何使用 pandas 的 `.astype()` 方法高效、安全地将 dataframe 中多个特定列的数据类型批量转换为整数,避免 nan 导致的类型转换错误,并提供可复用的代码范式。
在 pandas 中,.astype() 是最常用的数据类型转换方法。但需注意:直接对含缺失值(NaN)的浮点列调用 .astype(int) 会报错(ValueError: Cannot convert non-finite values (NA or inf) to integer),因为 int 类型不支持 NaN。因此,若目标列存在缺失值,必须先处理或选择兼容类型(如 Int64——pandas 的可空整数类型)。
以下是规范、健壮的操作步骤:
✅ 正确做法:分步赋值 + 使用可空整数类型(推荐)
import pandas as pd
import numpy as np
# 构建原始数据(注意:字典键为列索引,值为各列数据)
q7 = {
0: [4, 5.0, 2.0, 9.0, 1.0, 8],
1: [5, 6.0, np.nan, 3.0, np.nan, 2],
2: [6, np.nan, 7.0, np.nan, 4.0, 3]
}
# 创建 DataFrame 并转置 → 行为样本,列为特征(符合题设结构)
Q7 = pd.DataFrame(q7).T
# ✅ 安全转换第0列和第5列:使用 pandas 的可空整数类型 'Int64'(首字母大写)
Q7[0] = Q7[0].astype('Int64')
Q7[5] = Q7[5].astype('Int64')
print(Q7)输出:
0 1 2 3 4 5 0 4 5.0 2.0 9.0 1.0 8 1 5 6.0 NaN 3.0 NaN 2 2 6 NaN 7.0 NaN 4.0 3
? Int64(注意大写 I)是 pandas 提供的 nullable integer dtype,能安全容纳 NaN,是处理含缺失值整数列的首选方案。普通 int64 不支持 NaN,强制转换前必须填充或删除缺失值。
⚠️ 若坚持使用 int64:必须先处理缺失值
# 方案一:填充后再转(例如填 -1 作为占位符) Q7[0] = Q7[0].fillna(-1).astype(int) Q7[5] = Q7[5].fillna(-1).astype(int) # 方案二:删除含缺失值的行(谨慎使用,可能丢失数据) # Q7_clean = Q7.dropna(subset=[0, 5]) # Q7_clean[[0, 5]] = Q7_clean[[0, 5]].astype(int)
? 批量转换多列的简洁写法(推荐)
# 一次性转换多列(同样推荐 'Int64')
cols_to_int = [0, 5]
Q7[cols_to_int] = Q7[cols_to_int].astype('Int64')? 关键注意事项总结:
- ❌ 避免对含 NaN 的列直接使用 .astype(int) —— 必报错;
- ✅ 优先选用 'Int64'、'Int32' 等 nullable integer dtypes;
- ✅ 列名/索引需明确(本例中为整数位置索引 0 和 5);
- ✅ 赋值操作应直接作用于 DataFrame 的列视图(如 df[col] = ...),而非链式调用;
- ? .T 转置后,原字典的 key 成为列名,value 列表成为对应列数据 —— 理解数据结构是正确索引的前提。
掌握这一模式,即可稳健、清晰地完成任意多列的 dtype 转换任务。

















