基于@choldgraf方案改写:Pandas Query用变量作列名失败求助
Pandas query方法用变量作为列名查询的解决方案
我来帮你搞定这个问题——你遇到的执行失败,本质是Pandas query方法的命名空间规则导致的:query里的字符串会在它自己的表达式上下文里解析,它会把myvar当成DataFrame的列名,而不是你外部定义的那个变量myvar = 'Size',自然找不到对应列,也就出不来预期结果。
下面给你几种实用的解决办法:
方法1:用@引用外部变量+列名标识
这是Pandas官方推荐的方式,用@前缀告诉query这是外部变量,同时要把变量对应的列名用反引号或者eval包裹,让Pandas识别这是列名而非值:
import pandas as pd fooframe = pd.DataFrame({'Size':['Large', 'Medium', 'Small', 'Tiny'], 'Color':[1, 2, 3, 4]}) myvar = 'Size' # 方式A:用f-string把变量转成带反引号的列名(简洁直观) subframe = fooframe.query(f"`{myvar}` == 'Large'") # 方式B:用eval解析变量对应的列(兼容更老版本Pandas) subframe = fooframe.query("eval(@myvar) == 'Large'")
两种方式都能让Pandas正确识别你要用Size列来筛选,最终得到只包含Large行的结果。
方法2:用loc替代query(更直观的写法)
如果觉得query的语法有点绕,直接用loc索引会更简单,完全不用纠结命名空间的问题:
subframe = fooframe.loc[fooframe[myvar] == 'Large']
这种写法逻辑清晰,新手也不容易出错,适合简单的筛选场景。
验证结果
不管用哪种方法,最终得到的subframe都是符合预期的:
Size Color 0 Large 1
内容的提问来源于stack exchange,提问作者TempleGuard527
相关产品推荐
相关产品推荐

