含字符串对象的嵌套字典列表转pandas DataFrame及列拆分
问题描述
现有实时API接口地址linktoAPI,接口返回数据为嵌套字典列表。使用常规pandas字典列拆分方案处理时全部未达预期,核心原因是返回数据中键为history_value的字段值格式不统一,且实际存储为长字符串对象,而非原生字典类型。
尝试常规处理方案时触发的报错如下:
- 调用字典
get方法提取值时报错:'get' does not applicable for string - 做嵌套字典转DataFrame操作时报错:
'str' object is not a mapping
当前使用的初始代码如下:
from urllib.request import urlopen import pandas as pd import json url = "LINKTOAPI" response = urlopen(url) data_json = json.loads(response.read()) baoluu = pd.DataFrame(data_json) display(baoluu.head())
运行代码后可观察到history_value列存储的内容格式不统一,需求是将该列拆分为ngaybaoluu、ngayhoclai、lydo三个独立列。
解决方案
常规字典拆列方法仅支持列值为原生dict类型的场景,因此需要先对history_value列做容错解析,将字符串转换为结构化字典后再做字段提取,具体实现代码如下:
from urllib.request import urlopen import pandas as pd import json import ast def parse_history(content): # 处理空值、非字符串类型的异常条目 if pd.isna(content) or not isinstance(content, str): return {"ngaybaoluu": None, "ngayhoclai": None, "lydo": None} # 优先按标准JSON解析,失败则按Python字面量格式解析,兼容单引号字典场景 try: parsed_content = json.loads(content) except json.JSONDecodeError: try: parsed_content = ast.literal_eval(content) except (ValueError, SyntaxError): parsed_content = {} # 提取目标字段,键缺失时自动返回空值 return { "ngaybaoluu": parsed_content.get("ngaybaoluu"), "ngayhoclai": parsed_content.get("ngayhoclai"), "lydo": parsed_content.get("lydo") } url = "LINKTOAPI" response = urlopen(url) data_json = json.loads(response.read()) baoluu = pd.DataFrame(data_json) # 解析字段并拆分 parsed_cols = baoluu["history_value"].apply(parse_history).apply(pd.Series) # 合并回原表,不需要原history_value列可以在concat时drop掉该列 baoluu = pd.concat([baoluu, parsed_cols], axis=1) # 校验结果 display(baoluu.head())
方案兼容场景说明:
- 空值、缺失值条目不会触发报错
- 同时支持标准JSON格式(双引号包裹)、Python字典格式(单引号包裹)的字符串解析
- 完全无法解析的脏数据会自动填充空值,不会中断整体处理流程
内容的提问来源于stack exchange,提问作者Phạm Tấn Thành
相关产品推荐
相关产品推荐

