You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:35:28