我正在使用 Polars 0.11.0(nodejs 环境),但我不完全理解这种行为:
let df2 : pl.DataFrame = pl.DataFrame({
a: [1,9,3,9],
b: ["one","one","three","four"],
c: [1111,2222,3333,4444]
})
df2 = df2.filter( pl.col("a").eq( 9 ) )
logger.info("df2:", df2)
输出:
┌─────┬──────┬────────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ f64 ┆ str ┆ f64 │
╞═════╪══════╪════════╡
│ 9.0 ┆ one ┆ 2222.0 │
│ 9.0 ┆ four ┆ 4444.0 │
└─────┴──────┴────────┘
--- 但是---
如果我想使用 str 类型列 (b):
df2 = df2.filter( pl.col("b").eq( "one" ) )
输出: 错误:未找到:无法找到列“一”;有效列:[“a”,“b”,“c”]
并且必须使用 pd.lit():
df2 = df2.filter( pl.col("b").eq( pl.lit("one") ) )
┌─────┬─────┬────────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ f64 ┆ str ┆ f64 │
╞═════╪═════╪════════╡
│ 1.0 ┆ one ┆ 1111.0 │
│ 9.0 ┆ one ┆ 2222.0 │
└─────┴─────┴────────┘
为什么当我用 str 过滤时需要 pd.lit() ,为什么当我用 number 过滤时不需要?
请向我解释一下这种行为。谢谢!
如果
df2 = df2.filter( pl.col("a").eq( 9 ) )
有效
df2 = df2.filter( pl.col("b").eq( "one" ) )
为什么不呢?
当您将
.eq(9)
与 Polars
一起使用时,它会理解 9
是数字文字。它直接使用此值与列 a
中的值进行比较,但使用 string
默认情况下它需要列名称或表达式,使用 pl.lit()
您可以更正 Polars
默认行为并使其处理“一” " 作为文字字符串值,而不是列名。
简单来说,如果您需要使用
string
进行过滤,您需要像pl.lit
一样.eq( pl.lit("one"))
,如果您需要使用number
进行过滤,只需传递数字,例如.eq( "one" ))