如何在Pandas 0.23中使用query查询含空格的列?
如何在Pandas 0.23中使用
query()过滤带空格的列(动态条件支持) 当然可以不用删除列名空格直接用query()!你的问题出在用单引号引用列名——在query()的语法里,单引号表示的是字符串字面量,而不是DataFrame的列名。要引用带空格的列名,你需要用**反引号(`)**把列名包起来。
修正后的基础示例
先看针对你给出的代码的正确写法:
x1 = "ab" x2 = ["ab", "ac"] x3 = ["ab", "ad"] df = pd.DataFrame({ "t 1": ["a", "b", "ab"], "t 2":["b", "x", "ac"], "t 3":["a", "w", "ad"] }) # 用反引号包裹带空格的列名,同时注意单个值用==,列表用in result = df.query("`t 1` == @x1 & `t 2` in @x2 & `t 3` in @x3") print(result)
运行后会正确返回符合所有条件的行:
t 1 t 2 t 3 2 ab ac ad
动态生成多条件查询的方案
因为你提到实际场景有10个左右的动态过滤条件,手动写query字符串效率很低,这里提供一个灵活的动态生成方案:
# 第一步:维护一个条件字典,键是带空格的列名,值是对应的过滤目标(单个值或列表) filter_conditions = { "t 1": x1, "t 2": x2, "t 3": x3, # 可以继续添加更多列和条件 } # 第二步:动态生成每个条件的字符串片段 condition_parts = [] for col_name, target_val in filter_conditions.items(): if isinstance(target_val, (list, tuple)): # 如果目标是列表/元组,使用in语法 condition_parts.append(f"`{col_name}` in @filter_conditions['{col_name}']") else: # 如果目标是单个值,使用==语法 condition_parts.append(f"`{col_name}` == @filter_conditions['{col_name}']") # 第三步:把所有条件用&连接成完整的query语句 final_query = " & ".join(condition_parts) # 第四步:执行查询 dynamic_result = df.query(final_query)
这种方式只需要维护filter_conditions字典即可,不管新增多少条件都能自动生成对应的查询语句,非常适合你的动态场景。
为什么单引号写法不行?
在query()的表达式语境中,'t 1'会被解析成字符串"t 1",而不是引用DataFrame中名为t 1的列。反引号是Pandas专门用来标记非标准列名(带空格、特殊字符、关键字)的语法,从0.13版本开始就支持,你的0.23版本完全兼容。
内容的提问来源于stack exchange,提问作者ZaxR
相关产品推荐
相关产品推荐

