如何用纯Polars实现类似safe_literal_eval的字符串转列表功能?
问题
给定如下Polars DataFrame:
df = pl.DataFrame({'a': ["['b', 'c', 'd']"]})
想要将字符串格式的列表转为真正的列表类型,尝试使用str.json_decode()时出现报错:
ComputeError: error inferring JSON: InternalError(TapeError) at character 1 (''')
之后通过map_elements结合ast.literal_eval实现了需求:
import ast def safe_literal_eval(val): try: return ast.literal_eval(val) except (ValueError, SyntaxError): return val df = df.with_columns(a=pl.col('a').map_elements(safe_literal_eval, return_dtype=pl.List(pl.String)))
请问是否存在纯Polars的实现方式达成同样效果?
纯Polars实现方案
原因分析
报错是因为JSON规范要求字符串必须用双引号包裹,但你的输入字符串用的是单引号,str.json_decode()无法解析这种格式。
实现代码
可以先将字符串中的单引号替换为双引号,再使用str.json_decode(),同时用try_catch处理转换失败的情况,完全用Polars内置函数实现:
df = df.with_columns( a=pl.col('a') .str.replace_all("'", '"') .str.json_decode(pl.List(pl.String)) .try_catch(pl.col('a')) # 转换失败时返回原字符串 )
效果验证
执行后df的a列会被转为List(String)类型,对于符合格式的输入能正常转换,转换失败的情况会保留原字符串,和你之前的safe_literal_eval逻辑一致。
内容的提问来源于stack exchange,提问作者apostofes
相关产品推荐
相关产品推荐

