Pandas读取JSON数据量不符及添加solution字段求助
嵌套JSON处理问题排查与解决
一、过滤行数不符的问题
你遇到的核心问题是嵌套JSON未正确扁平化,导致severity_modification_type列并未读取到所有目标值,大部分行可能是NaN,用.query("severity_modification_type.ne('NONE')")过滤自然只得到少量结果。
解决步骤:
- 放弃直接用
pd.read_json,改用pd.json_normalize解析嵌套JSON——这是处理多层嵌套结构的标准方式。 - 先确认字段的实际路径:查看JSON结构,确认
severity_modification_type是在顶层还是嵌套在某个子键下(比如data.severity_modification_type)。
示例代码:
import pandas as pd import json # 读取72MB的JSON文件(直接加载完全可行) with open('你的文件.json', 'r', encoding='utf-8') as f: json_data = json.load(f) # 扁平化数据,根据JSON结构调整参数 # 如果JSON是条目数组,直接用pd.json_normalize(json_data) # 如果条目嵌套在某个键下(比如{"results": [...]}),则指定record_path='results' df = pd.json_normalize(json_data) # 先打印所有列名,确认severity_modification_type的列名是否正确 print(df.columns.tolist()) # 用布尔索引过滤(比query更直观,避免语法陷阱) filtered_df = df[df['severity_modification_type'] != 'NONE'] # 验证行数 print(f"过滤后行数:{len(filtered_df)}")
二、提取plugin.solution字段
同样依赖json_normalize,两种实现方式:
方法1:扁平化时直接提取
如果plugin是顶层字典,json_normalize会自动将其展开为plugin.solution格式的列。若需明确指定,可写:
df = pd.json_normalize( json_data, meta=['plugin.solution'] # 强制提取该嵌套字段 )
方法2:事后处理已有的DataFrame
如果已经有未完全扁平化的df,用apply提取:
df['plugin.solution'] = df['plugin'].apply(lambda x: x.get('solution') if isinstance(x, dict) else None)
关键注意点
- 务必确认JSON的实际嵌套层级:比如你的JSON结构如果是
{"items": [{"severity_modification_type": "...", "plugin": {...}}]},必须在json_normalize中指定record_path='items',否则无法正确读取每个条目。 - 可以用
df['severity_modification_type'].value_counts()查看该列的值分布,快速定位问题——如果大部分是NaN,说明字段路径没找对。
内容的提问来源于stack exchange,提问作者LObermeyer
相关产品推荐
相关产品推荐

