You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars列表列比较:获取第一列中存在于第二列的元素(保留原列表结构)

Polars列表列比较:获取第一列中存在于第二列的元素(保留原列表结构)

嘿,我来帮你搞定这个Polars的列表判断问题!你的需求很明确——对每行的sets列表里的每个元素,判断它是否存在于同一行的optional_members列表中,生成对应长度的布尔列表,而且要保持原列表的结构对吧?

你之前尝试用list.eval时踩了两个小坑:一是逻辑上搞反了遍历对象(应该遍历sets的元素而非optional_members),二是对list.eval的列引用方式不太对。其实list.eval里是可以正常引用同一行的其他列的,只要用对表达式就行。

正确的单一表达式解决方案

直接用这段代码就能得到你想要的结果:

import polars as pl

df = pl.DataFrame(
    {"sets": [[1, 4, 3], [1, 0]], "optional_members": [[1, 2, 3], [1, 2]]}
)

# 核心表达式
df = df.with_columns(
    result=pl.col("sets").list.eval(pl.element().is_in(pl.col("optional_members")))
)

print(df)

运行后输出完全符合你的预期:

shape: (2, 3)
┌───────────┬──────────────────┬─────────────────────┐
│ sets      ┆ optional_members ┆ result              │
│ ---       ┆ ---              ┆ ---                 │
│ list[i64] ┆ list[i64]        ┆ list[bool]          │
╞═══════════╪══════════════════╪═════════════════════╡
│ [1, 4, 3] ┆ [1, 2, 3]        ┆ [true, false, true] │
│ [1, 0]    ┆ [1, 2]           ┆ [true, false]       │
└───────────┴──────────────────┴─────────────────────┘

表达式原理说明

  • pl.col("sets").list.eval(...):指定对sets列的每个列表进行元素级遍历处理
  • pl.element():代表当前遍历到的sets列表中的单个元素
  • is_in(pl.col("optional_members")):判断当前元素是否存在于同一行的optional_members列表中
  • 整个表达式会自动为每行生成与sets长度一致的布尔列表,完美保留原列表结构

如果你的数据集很大,还可以加上parallel=True参数开启并行处理,提升执行效率:

df = df.with_columns(
    result=pl.col("sets").list.eval(pl.element().is_in(pl.col("optional_members")), parallel=True)
)

备注:内容来源于stack exchange,提问作者yz_jc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:59:36