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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:27