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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:00:03