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

如何在Polars中无需map_elements筛选列表列中以.xml结尾的字符串?

问题描述

现有一个Polars DataFrame,其中list_column列存的是字符串列表,需要筛选出每个列表里以.xml结尾的字符串。目前已经用map_elements实现了需求,想找不用map_elements的替代方法。

原始数据代码及输出:

import polars as pl

pl.Config(fmt_table_cell_list_len=6, fmt_str_lengths=100)

df = pl.DataFrame({'list_column': [['a.xml', 'b.xml', 'c', 'd'], ['e.xml', 'f.xml', 'g', 'h']]})
print(df)

输出:

shape: (2, 1)
┌──────────────────────────────┐
│ list_column                  │
│ ---                          │
│ list[str]                    │
╞══════════════════════════════╡
│ ["a.xml", "b.xml", "c", "d"] │
│ ["e.xml", "f.xml", "g", "h"] │
└──────────────────────────────┘

现有map_elements实现代码:

def func(x):
    return [y for y in x if '.xml' in y]

result = df.with_columns(pl.col('list_column').map_elements(func, return_dtype=pl.List(pl.String)))
print(result)

输出:

shape: (2, 1)
┌────────────────────┐
│ list_column        │
│ ---                │
│ list[str]          │
╞════════════════════╡
│ ["a.xml", "b.xml"] │
│ ["e.xml", "f.xml"] │
└────────────────────┘
替代方案

方案1:用list.eval配合字符串判断

Polars的list.eval可以对列表里的每个元素执行表达式,结合str.ends_with能准确筛选出以.xml结尾的字符串,写法如下:

result = df.with_columns(
    pl.col('list_column').list.eval(
        pl.element().filter(pl.element().str.ends_with('.xml'))
    )
)
print(result)

方案2:Polars 0.19.0+ 直接用list.filter

从Polars 0.19.0版本开始,新增了list.filter方法,直接就能对列表元素做筛选,代码更简洁直观:

result = df.with_columns(
    pl.col('list_column').list.filter(pl.element().str.ends_with('.xml'))
)
print(result)
方案优势
  • 性能更优:这些方案都是Polars原生的向量化操作,不像map_elements那样需要执行Python层面的循环,处理大数据量时速度提升明显。
  • 无需手动指定类型:Polars会自动推断返回的列表数据类型,省去了写return_dtype的步骤。
  • 代码可读性更强:尤其是list.filter的写法,逻辑清晰,一眼就能看懂筛选规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:16:17