Python pandas解析JSON提取嵌套结构DataFrame的PartNumber并解决KeyError
问题根因
当前代码执行报错的核心原因有两点:
- 现有DataFrame的
PartNumber列并非结构化嵌套字典,而是字典格式的纯文本字符串——当初解析原始JSON时未将嵌套的manufacturerPartNrs字段正常展平,导致这列存储的是被序列化为单引号字符串的字典内容,无法直接通过字典键访问 - pandas列是逐行存储值的Series结构,直接对整列执行
df['xxx']['yyy'][0]的字典索引逻辑,本质是对整个Series取键,而非逐行提取值,自然会抛出KeyError
落地实现方案
全程兼容空值、结构异常的场景,不会因为单条设备数据结构不符中断全流程:
- 先导入依赖库:
import ast import pandas as pd
说明:用
ast.literal_eval而非json.loads处理字符串转字典,因为当前列的字符串是Python单引号格式的字典,标准JSON解析器不兼容单引号写法
- 逐行把字符串形式的字典转成可操作的结构化对象:
# 兼容空值场景,避免空值引发解析报错 df["temp_pn"] = df["PartNumber"].apply( lambda x: ast.literal_eval(x) if pd.notna(x) else {} )
- 逐层嵌套提取物料编号,同时做标准化清理(去掉首尾多余空格):
def get_cleaned_part_number(pn_struct): try: # 按原始JSON的层级路径取值:manufacturerPartNr列表 -> 第一个元素 -> partNumber字段 raw_pn = pn_struct["manufacturerPartNr"][0]["partNumber"] # 规范化:去掉首尾多余的空格字符 return raw_pn.strip() except (KeyError, IndexError, TypeError): # 遇到字段缺失、结构异常的行直接返回空值,不中断整体流程 return None df["normalizedPartNumber"] = df["temp_pn"].apply(get_cleaned_part_number) # 删除临时中间列,保持DataFrame结构整洁 df = df.drop(columns=["temp_pn"])
执行效果
运行完成后,新增的normalizedPartNumber列会存储完全规范化的物料编号值:
- 原本带尾随空格的
'AIR-AP1231G-E-K9 '会被清理为'AIR-AP1231G-E-K9' - 结构异常、字段缺失的行不会触发程序报错,对应位置填充空值
内容的提问来源于stack exchange,提问作者pablo juarez
相关产品推荐
相关产品推荐

