pandas中名为True和False的列无法访问、重命名失败如何解决
问题成因
两个问题的核心原因分别是:
- 直接用
.True访问列触发语法错误:True/False是Python内置的布尔常量,属于语法保留关键字,pandas的点属性访问方式要求列名必须是合法的Python标识符,使用关键字作为属性名会直接被Python解释器判定为语法错误,根本不会进入pandas的列查找流程。 - 重命名不生效:透视表(
pivot_table、crosstab等)生成的True/False列,列名本身是布尔类型值,不是字符串。你写的rename映射里传入的key是字符串'True',和实际布尔类型的列名类型不匹配,pandas找不到对应列自然不会执行重命名。另外如果调用rename时没有将返回值赋值回原变量、也没有设置inplace=True,就算key写对了修改也不会作用到原表。
修复方案
你可以根据自己的使用场景选对应方法:
- 正确重命名列
将rename映射中的key从字符串改为实际的布尔值,注意接收返回值(更推荐这种写法,pandas后续版本会逐步废弃inplace参数):hardest_and_easiest_assesment = hardest_and_easiest_assesment.rename( columns={ 'id_assessment':'IdAssessment', True:'Success', # 这里是布尔值True,不要加引号 False:'Fail' # 可同步处理False列 } ) - 不重命名直接访问列
如果不想修改列名,不要用点属性访问,改用方括号索引,传入和列名类型一致的布尔值即可正常访问:# 访问列名为布尔True的列 hardest_and_easiest_assesment[True] - 从生成端避免问题
下次做透视操作前,可以先把作为分组维度的布尔序列映射为字符串值,从根源避免生成布尔类型的列名,省去后续处理的麻烦:# 示例:透视前先把布尔字段转为字符串 df['judge_result'] = df['judge_result'].map({True:'Success', False:'Fail'}) # 再执行透视操作,生成的列名就是可直接用点访问的合法字符串
小提示:如果拿不准列名的实际类型,可以执行
print(hardest_and_easiest_assesment.columns.tolist())查看输出,输出里不带引号的True/False就是布尔类型,带引号的才是字符串,匹配对类型就不会出现重命名找不到列的问题。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

