pandas生成条件列触发TypeError:str与int无法比较的问题排查
问题分析:Pandas赋值Gesture列触发TypeError错误
问题背景
现有数据集:
Name Verified Happy Gabriel True Yes John False No Daniella True Yes Gabriel False No Elena True Yes Gabriel False Yes
预期输出(新增Gesture列):
Name Verified Happy Gesture Gabriel True Yes Bye John False No Bye Daniella True Yes Bye Gabriel False No Hi Elena True Yes Bye Gabriel False Yes Bye
规则:当姓名为Gabriel、Verified为False且Happy为No时,Gesture列赋值为Hi,其余情况赋值为Bye。
尝试了两段代码均触发错误:
第一段代码
df['Gesture'] = np.where(df['Name'].eq('Gabriel') & df['Verified'].eq(False) & df['Happy'].eq('No'), 'Hi', 'Bye')
第二段代码
df['Gesture'] = ((df['Name'].eq('Gabriel') & (df['Verified'].eq(False) & (df['Happy'].eq('No'))).map({True:'Hi',False:'Bye'}))
错误信息:
TypeError: '<' not supported between instances of 'str' and 'int'
错误原因
这个错误的核心是数据类型不匹配:
Verified列大概率不是布尔类型(True/False),而是字符串类型('True'/'False'),或读取数据时混入了数值类型;- 当执行
df['Verified'].eq(False)时,Pandas尝试将字符串与布尔值/整数做对比,底层类型转换冲突引发了<运算不支持的错误; - 第二段代码还存在语法错误:括号不匹配,
map方法调用位置错误,导致布尔序列的逻辑运算未完成就被调用map。
解决方案
1. 先修正数据类型
确保Verified和Happy列的类型符合要求:
# 如果Verified是字符串格式的'True'/'False',转为布尔型 df['Verified'] = df['Verified'].map({'True': True, 'False': False}) # 确保Happy列全为字符串类型,避免数值混入 df['Happy'] = df['Happy'].astype(str)
2. 使用修正后的代码
方案一:numpy.where(第一段代码修正类型后即可运行)
import numpy as np df['Gesture'] = np.where( (df['Name'] == 'Gabriel') & (df['Verified'] == False) & (df['Happy'] == 'No'), 'Hi', 'Bye' )
方案二:Pandas布尔索引赋值(更直观)
# 先给所有行默认赋值为Bye df['Gesture'] = 'Bye' # 匹配规则的行单独赋值为Hi df.loc[ (df['Name'] == 'Gabriel') & (df['Verified'] == False) & (df['Happy'] == 'No'), 'Gesture' ] = 'Hi'
方案三:修正第二段代码(修复语法和类型问题)
# 先构造完整的布尔条件 cond = (df['Name'].eq('Gabriel') & df['Verified'].eq(False) & df['Happy'].eq('No')) # 用map将布尔值转换为指定字符串 df['Gesture'] = cond.map({True: 'Hi', False: 'Bye'})
内容的提问来源于stack exchange,提问作者Noob Coder
相关产品推荐
相关产品推荐

