pandas DataFrame过滤拼接查询条件返回0行空结果问题求助
问题根因定位
- 重复过滤冲突:生成初始
query时未排除SR_Quarter字段,若用户输入季度范围,初始query会生成`SR_Quarter` == "xxxx to xxxx"的匹配条件,要求字段值完全匹配带"to"的整段字符串,与后续拼接的范围条件互斥,无数据可同时满足两个条件,因此返回空结果。 - 范围条件语法错误:将" to "替换为范围符号后,前后的季度值未加引号,pandas的query语法会将其识别为变量而非字符串常量,导致匹配失效。
- 无效逻辑:
if sr == "": query行未执行任何赋值操作,属于无意义代码。
修复方案
修正后代码如下:
filter_dict = { 'Node': str(input("Enter a value for Node: ")), # 输入示例:12nm '`Issue Type`': str(input("Enter a value for Issue Type: ")), '`Status`': str(input("Enter a value for Status: ")), '`SR_Quarter`': str(input("Enter a value for SR_Quarter: "))# 输入示例为 '2020-Q4' to '2021-Q2' } # 生成基础过滤条件时排除季度字段,避免重复过滤 query = ' & '.join([f'{k} == "{v}"' for k, v in filter_dict.items() if k != '`SR_Quarter`' and v != ""]) sr_input = filter_dict['`SR_Quarter`'] if sr_input.strip() != "": # 处理季度过滤逻辑 if ' to ' in sr_input: start_quarter, end_quarter = sr_input.split(' to ', 1) # 给季度值加双引号,符合query语法要求 sr_condition = f'`SR_Quarter` >= "{start_quarter.strip()}" & `SR_Quarter` <= "{end_quarter.strip()}"' else: # 兼容单个季度精确匹配场景 sr_condition = f'`SR_Quarter` == "{sr_input.strip()}"' # 拼接条件,避免前置多余的&符号 if query: query = f"{query} & {sr_condition}" else: query = sr_condition df.query(query)
效果说明
- 消除了重复条件冲突,仅单独处理季度字段的过滤逻辑
- 所有字符串匹配值都添加了引号,符合pandas query语法规范
- 兼容单字段过滤、多字段组合过滤的所有场景
内容的提问来源于stack exchange,提问作者Anna Abrahamyan
相关产品推荐
相关产品推荐

