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

如何将含嵌套结构的JSON中projects字段完整转换为扁平化Pandas DataFrame

解决嵌套JSON到扁平化Pandas DataFrame的问题

我明白你现在的需求——把嵌套的项目数据完全展开,让author、custom_fields里的内容都变成单独的列,而不是留在嵌套结构里。下面给你几种可行的方案,从基础到灵活,你可以根据实际场景选择:

方案一:用pd.json_normalize快速展开单层级嵌套(处理author字段)

pandas自带的json_normalize函数就是为处理嵌套JSON设计的,它能自动将嵌套字典展开为带前缀的独立列,完美解决author这类单字典嵌套的问题:

import pandas as pd

# 注意:将JSON中的null替换为Python的None
data = {"projects":[{"author":{"id":163,"name":"MyApp","easy_external_id":None},"sum_time_entries":0,"sum_estimated_hours":29,"currency":"EUR","custom_fields":[{"id":42,"name":"System","internal_name":None,"field_format":"string","value":None},{"id":40,"name":"Short describe","internal_name":None,"field_format":"string","value":""}]}],"total_count":1772,"offset":0,"limit":1}

# 展开projects中的嵌套字典,自动生成带前缀的列名
df = pd.json_normalize(data['projects'])

# 此时你会得到author.id、author.name、author.easy_external_id等展开后的列
print(df.columns)

不过这时候custom_fields还是列表形式,因为它是数组类型的嵌套,json_normalize默认不会自动展开数组,需要额外处理。

方案二:完全展开custom_fields数组(转为项目的独立列)

因为custom_fields是每个项目对应多组键值对(字段名+字段值),我们可以把每组自定义字段转为字典,再合并到主DataFrame中:

# 第一步:先处理author的嵌套(同方案一)
df = pd.json_normalize(data['projects'])

# 第二步:将每个项目的custom_fields转为{字段名: 字段值}的字典
custom_field_dicts = []
for project in data['projects']:
    cf_dict = {cf['name']: cf['value'] for cf in project['custom_fields']}
    custom_field_dicts.append(cf_dict)

# 转为DataFrame后和主表合并
cf_df = pd.DataFrame(custom_field_dicts)
final_df = pd.concat([df.drop('custom_fields', axis=1), cf_df], axis=1)

# 最终你会得到所有扁平化的列:author.id、author.name、System、Short describe等
print(final_df.columns)

进阶方案:展开custom_fields的所有属性(适合需要分析字段细节的场景)

如果你不仅需要自定义字段的名称和值,还想保留id、field_format等属性,可以用json_normalize的record_path参数将数组展开为行,同时关联项目的其他信息:

df_full = pd.json_normalize(
    data['projects'],
    record_path='custom_fields',  # 指定要展开的数组字段
    # 指定需要保留的项目级元数据,支持嵌套字段
    meta=['sum_time_entries', 'sum_estimated_hours', 'currency', ['author', 'id'], ['author', 'name']],
    meta_prefix='project_'  # 给项目级字段加前缀区分
)

# 此时每个自定义字段会作为一行,同时带上所属项目的所有信息
print(df_full.head())

根据你的业务需求选择对应的方案即可,前两种适合将所有字段作为项目的列展示,进阶方案适合需要深入分析自定义字段细节的场景。

内容的提问来源于stack exchange,提问作者Cesc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:37:36