如何将多层嵌套JSON转换为指定结构的Pandas DataFrame?
需求与问题
我有一个包含多产品详情的JSON响应,结构如下:
all_content=[{'productcode': '0502570SRE', 'brand': {'code': 'MJ', 'name': 'Marie Jo'}, 'series': {'code': '0257', 'name': 'DANAE'}, 'family': {'code': '0257SRE', 'name': 'DANAE Red'}, 'style': {'code': '0502570'}, 'introSeason': {'code': '226', 'name': 'WINTER 2022'}, 'seasons': [{'code': '226', 'name': 'WINTER 2022'}], 'otherColors': [{'code': '0502570ZWA'}, {'code': '0502570PIR'}], 'synonyms': [{'code': '0502571SRE'}], 'stayerB2B': False, 'name': [{'language': 'de', 'text': 'DANAE Rot Rioslip'}, {'language': 'sv', 'text': 'DANAE Red '}, {'language': 'en', 'text': 'DANAE Red rio briefs'}, {'language': 'it', 'text': 'DANAE Rouge slip brasiliano'}, {'language': 'fr', 'text': 'DANAE Rouge slip brésilien'}, {'language': 'da', 'text': 'DANAE Red rio briefs'}, {'language': 'nl', 'text': 'DANAE Rood rioslip'}, # 省略其他语言项 ] }]
需要生成一个包含指定列的DataFrame,示例如下:
| productcode | synonyms_code | name_language_nl |
|---|---|---|
| 0502570SRE | 0502571SRE | rioslip |
目前已经通过嵌套循环获取了synonyms中的code值:
for item in all_content: synonyms_details = item ['synonyms'] for i in synonyms_details: print(i['code'])
请问如何从当前步骤实现目标DataFrame?
解决方案
方法1:循环构建数据列表后转DataFrame
先初始化空列表,遍历每个产品时提取所需字段值,最后用pandas.DataFrame转换:
import pandas as pd data = [] for item in all_content: # 提取产品编码 product_code = item['productcode'] # 提取同义词编码(支持空值处理,多同义词可按需拼接) synonyms_code = item['synonyms'][0]['code'] if item['synonyms'] else None # 提取荷兰语名称的最后一个词(对应示例需求) nl_name = None for name_entry in item['name']: if name_entry['language'] == 'nl': nl_name = name_entry['text'].split()[-1] break # 将字段加入数据列表 data.append({ 'productcode': product_code, 'synonyms_code': synonyms_code, 'name_language_nl': nl_name }) # 生成DataFrame df = pd.DataFrame(data) print(df)
方法2:列表推导式简化代码
用列表推导式一次性构建数据结构,代码更紧凑:
import pandas as pd data = [ { 'productcode': item['productcode'], 'synonyms_code': item['synonyms'][0]['code'] if item['synonyms'] else None, 'name_language_nl': next((entry['text'].split()[-1] for entry in item['name'] if entry['language'] == 'nl'), None) } for item in all_content ] df = pd.DataFrame(data) print(df)
补充说明
- 若产品存在多个同义词,可将
synonyms_code改为逗号拼接的字符串:','.join([s['code'] for s in item['synonyms']]) - 若不需要提取荷兰语名称的最后一个词,直接取完整文本即可,把
entry['text'].split()[-1]替换为entry['text'] - 代码包含空值判断逻辑,避免因缺少对应字段导致运行报错
内容的提问来源于stack exchange,提问作者Ron Kieftenbeld
相关产品推荐
相关产品推荐

