Pandas query查询遇‘boolean label can not be used’错误求助
问题分析与解决
问题场景
给定的DataFrame如下:
publisher_name show_name UniqueCount_promo_code UniqueValue_promo_code 0 publisher_name1 show_name1 2 [code1, ] 1 publisher_name1 show_name2 1 [code2] 2 publisher_name2 show_name3 2 [code3, code4]
想要筛选UniqueValue_promo_code列中包含空字符串/None且长度为2的行,编写了以下代码:
condition1 = lambda x: any(val == '' or val is None for val in x) and len(x) == 2 data = result.query(f"{condition1('UniqueValue_promo_code')} ")
运行后触发错误:
raise KeyError( KeyError: 'False: boolean label can not be used without a boolean index'
问题根源
你的代码存在两个核心问题:
- 参数传递错误:
condition1('UniqueValue_promo_code')是把字符串"UniqueValue_promo_code"传给lambda函数,而不是DataFrame中该列的实际列表数据。lambda函数处理字符串时,len(x)等于21(字符串长度),any(...)也为False,所以整个表达式返回False。 query()用法错误:query()方法需要传入的是布尔表达式字符串(比如"UniqueCount_promo_code == 2"),而不是直接传入布尔值False。当你把False作为字符串传入query时,它会把False当成列名去查找,自然找不到,触发KeyError。
正确实现方式
方法1:使用apply()筛选(推荐)
直接对目标列应用lambda函数生成布尔索引,再筛选行:
condition1 = lambda x: any(val == '' or val is None for val in x) and len(x) == 2 data = result[result['UniqueValue_promo_code'].apply(condition1)]
运行后会正确筛选出第0行数据。
方法2:修正query()的用法(不推荐)
由于query()对列表类型的列支持有限,需要用更复杂的表达式,不如apply()直观:
data = result.query("len(UniqueValue_promo_code) == 2 and ('' in UniqueValue_promo_code or None in UniqueValue_promo_code)")
内容的提问来源于stack exchange,提问作者Md Parvez Alam
相关产品推荐
相关产品推荐

