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

Polars如何使用Expression API处理DataFrame行级逻辑?

Polars行级处理的Expression API实现方案

当然可以用Polars的Expression API处理行级逻辑,而且相比apply能提供更优的性能。针对你给出的示例需求,以下是具体实现:

步骤1:构造示例DataFrame

import polars as pl

l = [(1,2,3,4,22,23,None,None),(5,6,8,10,None,None,None,None)]
df = pl.DataFrame(l, schema=[f"col_{i}" for i in range(8)])

步骤2:用Expression API实现行级转换

result_df = df.select(
    # 提取第一列
    pl.col[0].alias("first_col"),
    # 提取第二列
    pl.col[1].alias("second_col"),
    # 合并后续列并过滤None元素
    pl.concat_list(pl.col[2:])
        .list.filter(pl.element().is_not_none())
        .alias("non_none_list")
)

结果说明

运行后result_df的输出为:

shape: (2, 3)
┌──────────┬───────────┬──────────────────┐
│ first_col ┆ second_col ┆ non_none_list    │
│ ---      ┆ ---       ┆ ---              │
│ i64      ┆ i64       ┆ list[i64]        │
╞══════════╪═══════════╪══════════════════╡
│ 1        ┆ 2         ┆ [3, 4, 22, 23]   │
│ 5        ┆ 6         ┆ [8, 10]          │
└──────────┴───────────┴──────────────────┘

核心逻辑解释

  • pl.col[n]:按列的位置索引快速选取目标列,无需手动写列名
  • pl.concat_list(pl.col[2:]):将从第三列开始的所有列合并为每行对应的列表
  • list.filter(pl.element().is_not_none()):对每行的列表进行过滤,保留非None的元素

这种方式完全基于Polars的向量化Expression API实现,避免了apply的逐行遍历开销,在数据量较大时性能优势会非常明显。

内容的提问来源于stack exchange,提问作者exch_cmmnt_memb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:37:38