You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多层嵌套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,示例如下:

productcodesynonyms_codename_language_nl
0502570SRE0502571SRErioslip

目前已经通过嵌套循环获取了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:10:56