pandas DataFrame条件过滤报&不支持list运算TypeError解决方法
问题产生原因
报错核心是布尔索引写法不符合pandas语法规则:
- 单步判断
df_y["Year"]<100和df_y['Year']>22本身会返回存储布尔值的pandas Series对象,是pandas布尔索引支持的合法输入,但你给这两个判断结果分别套了一层原生Python方括号[],直接把布尔Series转成了Python原生列表对象 - Python原生列表不支持
&按位与运算,因此解释器直接抛出TypeError: unsupported operand type(s) for &: 'list' and 'list'异常。
额外注意:哪怕去掉了外层多余的方括号,如果不给每个独立判断条件加圆括号,也会因为&运算符优先级高于比较运算符,触发运算逻辑错误。
正确修复方案
基础修复写法
去掉包裹单个条件的多余方括号,给每个独立判断条件加圆括号分隔,修正后的代码如下:
df4 = df_y[(df_y["Year"] < 100) & (df_y["Year"] > 22)]
更简洁的等价写法
针对连续数值区间筛选场景,可以直接用pandas内置的between()方法,不需要手动写两个条件做与运算,代码可读性更高。因为筛选规则是开区间22 < x < 100(不包含两端端点),需要指定区间开闭参数:
df4 = df_y[df_y["Year"].between(22, 100, inclusive="neither")]
筛选注意事项
- 多条件组合筛选时,
&对应逻辑「且」、|对应逻辑「或」、~对应逻辑「非」,三个运算符都是向量级运算,仅支持pandas Series/数组对象,不支持原生Python列表 - 所有独立的比较判断条件必须用圆括号
()包裹,避免运算符优先级导致的执行顺序错误 - 连续数值区间筛选优先使用
between()方法,减少多条件拼接的语法错误概率
内容的提问来源于stack exchange,提问作者On J
相关产品推荐
相关产品推荐

