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

