DataFrame过滤报错TypeError:str与bool不支持&运算,求解决方案
问题:DataFrame计算中间评级时出现TypeError错误
错误信息
TypeError: unsupported operand type(s) for &: 'str' and 'bool'
背景信息
从CSV读取字符串类型的评级数据,创建DataFrame:
df = pd.read_csv('csv path', usecols=['rating1','rating2','rating3'])
当前DataFrame结构:
rating1 rating2 rating3 0 D D C 1 C B A 2 B B B
预期处理后结果:
rating1 rating2 rating3 mediumrating 0 D D C 1 1 C B A 3 2 B B B 3
评级映射字典:
ranking = { 'D': 1, 'C':2, 'B': 3, 'A' : 4 }
原代码(逻辑:所有评级相同取最小值;两个相同取最低值;三个不同过滤最大最小):
if df == df.loc[(['rating1'] == df['rating2'] & df['rating1'] == df['rating3'])]: df['mediumrating'] = df.replace(ranking).min(axis=1) elif df == df.loc[(['rating1'] == df['rating2'] | df['rating1'] == df['rating3'] | df['rating2'] == df['rating3'])]: df['mediumrating'] = df.replace(ranking).min(axis=1) else: df['mediumrating'] == df.loc[(df.replace(ranking) > df.replace(ranking).min(axis=1) & df.replace(ranking)
问题分析与修正
原代码核心问题:
- 布尔运算未加括号,导致优先级错误(
&/|优先级高于==),引发字符串与布尔值的非法运算 - 直接用
df == df[...]判断整行逻辑错误,应按行生成布尔掩码 - else分支代码不完整,逻辑混乱
修正后的代码
import pandas as pd # 读取数据 df = pd.read_csv('csv path', usecols=['rating1','rating2','rating3']) ranking = {'D': 1, 'C':2, 'B': 3, 'A' : 4} # 统一转换为数值评级,避免重复替换 num_df = df.replace(ranking) # 定义每行的中间评级计算逻辑 def get_medium_rating(row): vals = row.tolist() unique_vals = set(vals) if len(unique_vals) == 1: # 所有评级相同,直接返回该值 return vals[0] elif len(unique_vals) == 2: # 存在两个不同评级,取较小值 return min(unique_vals) else: # 三个评级都不同,排序后取中间值 return sorted(vals)[1] # 应用函数生成新列 df['mediumrating'] = num_df.apply(get_medium_rating, axis=1)
代码说明
- 先将字符串评级批量转换为数值,提升代码效率
- 用
apply按行处理,逻辑清晰,规避布尔运算优先级问题 - 针对三种场景分别处理:
- 所有值相同:直接返回该值
- 两个不同值:返回较小值(匹配原需求的“取最低值”)
- 三个不同值:排序后取中间位置的值(即过滤最大、最小值后的结果)
运行后即可得到预期的DataFrame结果。
内容的提问来源于stack exchange,提问作者bananas
相关产品推荐
相关产品推荐

