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
相关产品推荐
相关产品推荐

