假设我有这个:
df = polars.DataFrame(dict(
j=[1,2,3],
k=[4,5,6],
l=[7,8,9],
))
shape: (3, 3)
┌─────┬─────┬─────┐
│ j ┆ k ┆ l │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 4 ┆ 7 │
│ 2 ┆ 5 ┆ 8 │
│ 3 ┆ 6 ┆ 9 │
└─────┴─────┴─────┘
我可以一次过滤一列的特定行,即:
df = df.filter(
(polars.col('j') == 2) &
(polars.col('k') == 5) &
(polars.col('l') == 8)
)
shape: (1, 3)
┌─────┬─────┬─────┐
│ j ┆ k ┆ l │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 2 ┆ 5 ┆ 8 │
└─────┴─────┴─────┘
不过,我想要与列表进行比较(这样我就可以避免列出每一列,并适应可变的列DataFrame
),例如:
df = df.filter(
polars.concat_list(polars.all()) == [2, 5, 8]
)
...
exceptions.ArrowErrorException: NotYetImplemented("Casting from Int64 to LargeList(Field { name: \"item\", data_type: Int64, is_nullable: true, metadata: {} }) not supported")
你知道为什么上面会抛出这个异常吗?
我可以手动构建该表达式:
df = df.filter(
functools.reduce(lambda a, e: a & e, (polars.col(c) == v for c, v in zip(df.columns, [2, 5, 8])))
)
但我希望有一种方法可以直接比较名单--例如,就像我最初有这DataFrame
个:
df = polars.DataFrame(dict(j=[
[1,4,7],
[2,5,8],
[3,6,9],
]))
shape: (3, 1)
┌───────────┐
│ j │
│ --- │
│ list[i64] │
╞═══════════╡
│ [1, 4, 7] │
│ [2, 5, 8] │
│ [3, 6, 9] │
└───────────┘
并希望找到与[2, 5, 8]
匹配的行.有什么提示吗?