Polars中非等于条件用列名过滤触发NameError的原因咨询
为什么Polars中直接用列名仅在等于条件下能过滤,其他条件会报错?
问题原因
df.filter(foo=1)可行的本质:这是Polars专门给等于判断做的语法糖。你传的foo=1不是直接调用Python变量,Polars会自动把它转换成pl.col("foo") == 1的表达式。但这种语法只支持等于判断——毕竟Python函数参数只能用=传递键值对,没法写>这类运算符。df.filter(foo>1)报错的原因:Python会先解析foo>1这个表达式,它会在当前代码的变量作用域里找foo,但你根本没定义过这个变量,自然就触发NameError了。Polars管不了这个,因为表达式在传给filter方法之前就被Python解析完成了。
满足简洁需求的解决方案
如果不想每次都写pl.col("列名"),可以用这两种方法:
1. 字符串表达式(最推荐)
Polars支持直接传入字符串格式的过滤条件,会自动识别列名和运算符,所有比较逻辑都能用:
print(df.filter("foo > 1")) print(df.filter("bar <= 7")) print(df.filter("ham == 'b'"))
2. 提前定义列引用变量
要是同一列需要多次用于过滤,可以先把列引用存成变量,之后直接调用:
foo = pl.col("foo") print(df.filter(foo > 1)) print(df.filter(foo == 3))
内容的提问来源于stack exchange,提问作者okayama-taro
相关产品推荐
相关产品推荐

