如何将含嵌套结构的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
相关产品推荐
相关产品推荐

