最简单可靠的方式是直接用 astype(int),因布尔值底层即1和0;含nan时需先fillna(false)或改用'int64',避免typeerror。

直接用 astype(int) 最简单可靠
布尔值 True 和 False 在 Pandas 中底层就是 1 和 0,所以直接调用 astype(int) 是最自然、性能最好、也最不容易出错的方式。它会原样映射:True → 1,False → 0。
常见错误是手动写 df['col'].map({True: 1, False: 0}) 或用 np.where,没必要——既慢又冗余,还可能因空值或类型不一致报错。
- 如果列含
NaN,astype(int)会失败(int 不支持 NaN),此时必须先处理缺失值,比如用fillna(False).astype(int) - 若列是 object 类型但内容是布尔字符串(如
"True"、"False"),得先转成布尔再转整数:df['col'].map({'True': True, 'False': False}).astype(int) - 对 Series 操作和对 DataFrame 单列操作效果一致,无需额外包装
遇到 TypeError: Cannot convert non-finite values (NA or inf) to integer 怎么办
这是最常卡住人的错误,本质是列里有 NaN(或 pd.NA),而目标 dtype 是纯 int64,不接受缺失值。
解决思路不是硬转,而是明确「缺失值想怎么表达」:
- 想把
NaN当作0:用df['col'].fillna(0).astype(int) - 想把
NaN当作False(更语义合理):用df['col'].fillna(False).astype(int) - 想保留缺失语义,改用可空整型(Pandas 1.0+):
df['col'].astype('Int64')(注意首字母大写,这是 nullable integer dtype)
'Int64' 能存 1、0、<font color="red">pd.NA</font>,且不会自动转成 float,适合后续参与数值计算又不想丢缺失信息的场景。
为什么不用 apply(int) 或 map(int)
这些写法看似直观,但实际会触发 Python 层循环,性能差一个数量级,尤其在百万行以上数据时明显拖慢;而且遇到 NaN 直接抛 TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'。
对比:
df['flag'].astype(int) # ✅ 向量化,快,清晰
df['flag'].apply(int) # ❌ 慢,不处理 NaN,易崩
另外,map(int) 对 Series 也不安全——map 会把 NaN 当作 key 去查,结果变成 NaN,但类型仍是 float,不是你想要的整数列。
用 where 或 numpy.where 的适用场景
这类方式适合需要条件转换的复杂逻辑,比如「True → 1,False → -1,NaN → 0」,而不是单纯布尔转 0/1。
基础布尔转整数时,它们属于过度设计:
-
np.where(df['col'], 1, 0)可行,但返回的是 numpy array,要再包一层pd.Series才能回填;且对NaN默认当False处理,行为隐晦 -
df['col'].where(df['col'], 0)只能做单向替换(True 保留,其余变 0),无法表达双值映射 - 所有基于条件的写法都比
astype多一重判断开销,无必要
真正需要自定义映射时,优先考虑 map 配合字典(确保覆盖所有可能值),而不是硬编码逻辑。
Pandas 布尔转整数这件事本身很简单,但实际中绝大多数问题都出在没意识到 NaN 的存在,或者误用了低效/不健壮的写法。盯住 dtype 兼容性和缺失值策略,比纠结“哪种函数看起来更高级”重要得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











