如何使用Pandas展平包含多个嵌套字典的JSON响应?
问题描述
我收到如下JSON响应:
{ "id": 7, "status": "Public", "Options": [ { "id": 8, "pId": 7 }, { "id": 9, "pId": 10 } ] }
我尝试用Pandas DataFrame将其展平,代码如下:
import pandas as pd df = pd.DataFrame.from_dict(response_data) # 拆分产品选项 df=df.join(pd.DataFrame(df["Options"].values.tolist()).add_prefix('Options_')) df = df.drop(columns=["Options"]) # 拆分嵌套产品选项 df=df.join(pd.DataFrame(df["Options_0"].values.tolist()).add_prefix('Options0_')) df = df.drop(columns=["Options_0"])
这段代码在响应仅包含一个Options元素时可以正常工作:
{ "id": 7, "status": "Public", "Options": [ { "id": 8, "pId": 7 } ] }
但现在JSON响应中有多个Options元素,我该如何迭代处理,得到如下格式的DataFrame?
id status Options_0_id Options_0_pId Options_1_id Options_1_pId 7 Public 8 7 9 10
解决方案
可以通过将Options列展开为多层DataFrame后重命名列名的方式,一次性处理所有嵌套的Options元素,无需手动逐个迭代:
import pandas as pd response_data = { "id": 7, "status": "Public", "Options": [ { "id": 8, "pId": 7 }, { "id": 9, "pId": 10 } ] } # 初始DataFrame,用列表包裹确保生成单行数据 df = pd.DataFrame.from_dict([response_data]) # 展开Options列成多层结构的DataFrame options_df = df['Options'].apply(pd.Series).stack().apply(pd.Series).unstack() # 重命名列,统一格式为 Options_<索引>_<字段名> options_df.columns = [f'Options_{i}_{col}' for i, col in options_df.columns] # 删除原Options列后,拼接展开的选项数据 result_df = df.drop(columns=['Options']).join(options_df) print(result_df)
运行后输出的DataFrame即为目标格式:
id status Options_0_id Options_0_pId Options_1_id Options_1_pId 0 7 Public 8 7 9 10
代码说明
df['Options'].apply(pd.Series):将每行的Options列表转化为子DataFrame,每行对应一个Options元素stack().apply(pd.Series).unstack():把子DataFrame中的字典元素展开为具体字段,同时保留Options的索引(0、1...)- 列名重命名:将多层列索引合并为
Options_<索引>_<字段名>的统一格式 - 表拼接:删除原Options列后,将展开的选项数据与原表合并
这种方法可自动适配任意数量的Options元素,无需手动编写针对单个索引的拆分逻辑。
内容的提问来源于stack exchange,提问作者Sab_91
相关产品推荐
相关产品推荐

