假设我有这个:

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]匹配的行.有什么提示吗?

推荐答案

您可以将多个条件传递给.all()而不是functools.reduce

对于列表列,可以将每个索引处的值与.arr.get()进行比较:

df.filter(
   pl.all(
      pl.col("j").arr.get(n) == row[n]
      for n in range(len(row))
      for row in [[2, 5, 8]]
   )
)
shape: (1, 1)
┌───────────┐
│ j         │
│ ---       │
│ list[i64] │
╞═══════════╡
│ [2, 5, 8] │
└───────────┘

我不确定这为什么行不通:

>>> df.filter(pl.col("j") == pl.lit([[2, 5, 8]]))
shape: (0, 1)
┌───────────┐
│ j         │
│ ---       │
│ list[i64] │
╞═══════════╡
└───────────┘

对于常规列,您可以修改您的示例:

df.filter(
   pl.all(
      pl.col(col) == value
      for col, value in dict(zip(df.columns, [2, 5, 8])).items()
   )
)

Python相关问答推荐

获取Azure Pipelines以从pyproject.toml(而不是relevments_dev.文本)安装测试环境

Docker-compose:为不同项目创建相同的容器

使用Python C API重新启动Python解释器

"Discord机器人中缺少所需的位置参数ctx

有什么方法可以避免使用许多if陈述

Python中MongoDB的BSON时间戳

Locust请求中的Python和参数

提取两行之间的标题的常规表达

滚动和,句号来自Pandas列

用Python解密Java加密文件

在Python中管理打开对话框

如何从.cgi网站刮一张表到rame?

ThreadPoolExecutor和单个线程的超时

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

不能使用Gekko方程'

使用Python从URL下载Excel文件

启用/禁用shiny 的自动重新加载

合并帧,但不按合并键排序

使用特定值作为引用替换数据框行上的值

剪切间隔以添加特定日期