如何在Pandas query中引用并实例化自定义类?
在Pandas query中使用自定义类实例化的解决方案
问题原因
Pandas的query()方法表达式解析器不支持直接在查询语句中对列(Series)进行逐元素的自定义类实例化操作。即使通过local/global参数传入类,query也无法处理foo(col1).v这类语法——一方面解析器无法识别类实例化后的属性访问逻辑,另一方面直接将整个Series传入类构造函数也不符合逐元素处理的需求,这就是出现KeyError: 'foo'的核心原因。
解决方案
以下是几种可行的实现方式:
方案1:提前生成处理列再用query
先将列中每个元素转换为foo实例并提取v属性,生成新列后再用query查询:
import pandas as pd class foo: def __init__(self, var): self.v = var df = pd.DataFrame({'col1':[1,2]}) # 逐元素生成foo实例并提取v属性 df['foo_v'] = df['col1'].apply(lambda x: foo(x).v) # 用query筛选符合条件的行 result = df.query('foo_v > 1') print(result)
方案2:直接使用布尔索引替代query
这是更高效的方式,跳过query直接用apply生成布尔掩码筛选行:
import pandas as pd class foo: def __init__(self, var): self.v = var df = pd.DataFrame({'col1':[1,2]}) # 生成布尔掩码并筛选 result = df[df['col1'].apply(lambda x: foo(x).v > 1)] print(result)
方案3:封装逻辑为函数,传入query使用
如果一定要用query,可以将类实例化和判断逻辑封装为函数,通过向量化处理适配列操作后传入query:
import pandas as pd class foo: def __init__(self, var): self.v = var # 封装判断逻辑 def check_foo_condition(x): return foo(x).v > 1 df = pd.DataFrame({'col1':[1,2]}) # 转为向量化函数,适配query的列操作 vectorized_check = pd.vectorize(check_foo_condition) result = df.query('@vectorized_check(col1)') print(result)
内容的提问来源于stack exchange,提问作者AMuresan
相关产品推荐
相关产品推荐

