如何处理Pandas中包含字典的字符串列?
批量解析Pandas DataFrame中的JSON格式字符串报错
问题背景
现有Pandas DataFrame结构如下:
| ID | computed_data |
|---|---|
| 0987 | "{"Status":{"participate":14,"create":"10","activ":"0"},"rescount":22,"comcount":0,"partrate":0}" |
| 4568 | "{"Status":{"participate":49,"create":"40","activ":"27"},"rescount":22,"comcount":0,"partrate":73.47}" |
| 1234 | "{"Status":{"participate":3,"create":"3","activ":"1"},"comcount":0,"partrate":100,"rescount":42}" |
想要访问computed_data列中的值,用eval(df["computed_data"][0])处理单个单元格正常,但用以下循环批量转换时:
data = [] for x, i in enumerate(df["Computed Data"]): data.append(eval(df["Computed Data"][x]))
出现错误:name 'null' is not defined,DataFrame无空值,形状为3601。
问题原因
- 部分单元格的JSON字符串包含JSON语法的
null,但Python的eval()无法识别该关键字(Python对应为None),导致报错。 - 循环中使用的列名
"Computed Data"与原DataFrame的列名"computed_data"大小写不匹配,可能引发额外问题。
解决方案
放弃eval(),使用Python内置的json模块解析,它能自动处理JSON与Python数据类型的转换(包括null转None),且更安全。
方法一:用apply()批量解析(高效推荐)
import json # 确保列名与原DataFrame一致 df['parsed_data'] = df['computed_data'].apply(lambda x: json.loads(x.strip('"')))
注:若字符串外层包裹了多余的双引号,需用strip('"')去除,否则json.loads会解析失败
方法二:修正循环逻辑
import json data = [] # 遍历列时使用正确的列名 for item in df['computed_data']: parsed_item = json.loads(item.strip('"')) data.append(parsed_item)
额外说明
eval()存在安全风险,若字符串包含恶意代码会直接执行,且无法兼容JSON的特殊语法(如true/false),使用专门的JSON解析工具是更稳妥的选择。
内容的提问来源于stack exchange,提问作者Koutaax
相关产品推荐
相关产品推荐

