如何将Polars DataFrame列中字符串形式的列表转为实际列表?
Polars将字符串形式列表转为实际列表的最优方案
我是Polars库的新手,需求是将Polars DataFrame某列单元格中字符串形式的列表转为实际列表。在Pandas库中,我会使用apply()结合Python内置的eval()函数实现,例如eval("[1,2,3]")会返回[1,2,3]。在Polars中,我可以通过以下代码实现预期效果,但Polars强烈推荐使用其Expression API,我查阅了Expr.str属性却未找到对应的表达式方法,请问我是否遗漏了相关方法,还是只能使用map_elements这类方法?
data = {'col_string': ['[1,2,3]', '[4,5,6]']} df = pl.DataFrame(data) df = df.with_columns(pl.col('col_string').map_elements(eval).alias('col_list')) # 输出结果 shape: (2, 2) ┌────────────┬───────────┐ │ col_string ┆ col_list │ │ --- ┆ --- │ │ str ┆ list[i64] │ ╞════════════╪═══════════╡ │ [1,2,3] ┆ [1, 2, 3] │ │ [4,5,6] ┆ [4, 5, 6] │ └────────────┴───────────┘
核心结论
Polars确实没有直接对应eval的字符串表达式方法,但有更安全、性能更高的纯Expression API替代方案,完全不需要依赖map_elements(eval)。
方案1:字符串处理+类型转换(通用场景)
如果字符串列表格式简单(无嵌套、元素为基础类型),可通过字符串替换、分割再转类型实现:
import polars as pl data = {'col_string': ['[1,2,3]', '[4,5,6]']} df = pl.DataFrame(data) df = df.with_columns( pl.col("col_string") .str.replace(r"^\[|\]$", "") # 移除首尾方括号 .str.split(",") # 按逗号分割为字符串列表 .list.eval(pl.element().cast(pl.Int64)) # 将每个元素转为整数 .alias("col_list") ) print(df)
该方案全程使用Polars向量化表达式,性能远高于逐行执行的map_elements,同时规避了eval的安全风险。
方案2:JSON解码(推荐,适用于标准JSON格式)
你的示例字符串属于标准JSON数组,直接用str.json_decode表达式即可一步完成转换,代码更简洁:
import polars as pl data = {'col_string': ['[1,2,3]', '[4,5,6]']} df = pl.DataFrame(data) df = df.with_columns( pl.col("col_string").str.json_decode(pl.List(pl.Int64)).alias("col_list") ) print(df)
str.json_decode会自动解析JSON格式字符串,返回指定类型的列表,性能与安全性均为最优。
为什么不推荐map_elements(eval)?
- 安全风险:
eval会执行任意Python代码,若数据中存在恶意构造的字符串(如"__import__('os').system('rm -rf /')"),会引发严重安全问题。 - 性能低下:
map_elements是逐行调用Python函数,无法利用Polars的向量化优化,数据量较大时性能差距会非常显著。
内容的提问来源于stack exchange,提问作者exch_cmmnt_memb
相关产品推荐
相关产品推荐

