使用Pandas Normalize转嵌套JSON为CSV时,提取cve.description.description_data数据
解决
cve.description.description_data列的JSON格式提取问题 我明白你的困扰——用json_normalize处理NVD的CVE数据时,像cve.description.description_data这种嵌套数组型的JSON字段经常会被保留成原始格式,没法直接用。下面给你两种针对性的解决方法,适配不同的场景:
方法一:针对description_data仅含单个元素的常规情况(NVD数据大多如此)
NVD的CVE数据里,description_data通常是只包含一个描述项的数组,我们可以先提取数组里的字典,再展开成单独的列:
import json import pandas as pd # 加载JSON文件 with open('nvdcve-1.0-modified.json') as f: d = json.load(f) # 展开第一层嵌套数据 nycphil = pd.json_normalize(d['CVE_Items']) # 提取description_data数组中的第一个元素(常规情况只有一个) desc_data = nycphil['cve.description.description_data'].apply(lambda x: x[0] if len(x) > 0 else {}) # 将提取到的字典展开为独立列 desc_df = pd.json_normalize(desc_data) # 重命名列,让含义更清晰 desc_df.columns = ['cve_description_language', 'cve_description_content'] # 合并回原DataFrame,同时删除原JSON格式列 nycphil = pd.concat([nycphil.drop('cve.description.description_data', axis=1), desc_df], axis=1) # 查看处理后的前3行数据 nycphil.head(3)
方法二:针对description_data含多个元素的特殊情况
如果你的数据里存在多个描述项的情况,可以先把数组拆分成多行,再展开字段:
# 承接上面加载好的nycphil数据 # 将description_data数组拆分成多行 nycphil_exploded = nycphil.explode('cve.description.description_data') # 展开每行的描述字典 desc_df_exploded = pd.json_normalize(nycphil_exploded['cve.description.description_data']) # 合并数据并清理原列 nycphil_final = pd.concat([nycphil_exploded.drop('cve.description.description_data', axis=1), desc_df_exploded], axis=1)
这样处理后,你就能得到完全展开的结构化数据,导出CSV的时候就不会有嵌套JSON的问题了。
内容的提问来源于stack exchange,提问作者user9551424
相关产品推荐
相关产品推荐

