用pd.eval()将字符串转为字典时报NotImplementedError,如何正确使用该方法?
关于
pd.eval无法解析字典格式字符串的问题说明 报错核心原因
pd.eval是Pandas专为向量化批量表达式计算设计的求值工具,核心定位是高效执行涉及Series、DataFrame的算术、比较、布尔运算,本身的语法解析器从设计之初就没有实现字典(Dict)类型节点的解析逻辑。- 触发的
NotImplementedError: 'Dict' nodes are not implemented是源码层面的硬限制:只要待解析的字符串内容被解析为字典结构节点,无论传参、调用方式怎么调整,都会直接抛出该错误。
两种调用写法失效的逻辑
- 写法
ds.apply(pd.eval):逐行将Series中的字符串传递给pd.eval,每个字符串本身就是带{}的字典结构,走到Dict节点解析分支直接报错。 - 写法
ds.apply(lambda x: pd.eval(x)):仅多包了一层lambda,传入的待解析内容没有变化,同样会触发未实现的节点报错。
能否通过调整写法用pd.eval完成字典字符串转换
- 不存在可绕过该限制的调整方案。哪怕为
pd.eval指定engine='python'、parser='python'等所有可用参数,其内置的解析逻辑依然会在遇到Dict节点时抛出NotImplementedError——这个限制不是参数配置能解决的,属于工具本身的能力边界。 - 实际测试中,哪怕直接单值传入最简字典字符串
pd.eval("{'level':0}"),也会触发完全相同的报错,和是否批量调用没有关系。
适配该场景的正确实现方案
该需求本身不属于pd.eval的适用范围,无需硬凑工具调用,两种安全高效的实现方式:
- 采用
ast.literal_eval逐行转换:这是通用的安全字面量解析方案,不会执行任意危险代码,可兼容字典、列表等嵌套结构的字符串转原生类型需求,对应代码:ds.apply(literal_eval) - 若待解析字符串为标准JSON格式,采用
json.loads逐行解析的性能更优,对应代码:import json ds.apply(json.loads)
内容的提问来源于stack exchange,提问作者Anurag Dabas
相关产品推荐
相关产品推荐

