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

如何扁平化嵌套JSON以提取字段生成pandas DataFrame

嵌套JSON转DataFrame解决方案

现有代码问题排查

  • 你已经对原始响应数据做了递归扁平化处理,但后续又用pd.json_normalize(response)直接覆盖了处理后的结果,是导致嵌套的products字段没有被正确展开的直接原因
  • 代码中的df.append方法已在pandas 2.0及以上版本废弃,建议使用pd.concat替代
  • 代码片段中response = pro属于无意义的冗余错误代码

方案1:沿用你编写的flatten_json函数实现

import pandas as pd
import requests

def flatten_json(y):
    out = {}

    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x

    flatten(y)
    return out

# 接口请求部分
response = requests.request("POST", url, headers=headers, data=payload).json()
vendas_data = response['vendas']

# 扁平化每个嵌套对象
dic_flattened = [flatten_json(d) for d in vendas_data]
df_pandas = pd.DataFrame(dic_flattened)

# 合并到全局dfa,替代废弃的append方法
dfa = pd.concat([dfa, df_pandas], ignore_index=True)
print(dfa)

处理后原来的products嵌套字段会自动展开为products_0_code、products_0_lacre、products_1_code这类独立列,每个下标对应原列表中的一个商品。

方案2:直接用pd.json_normalize内置参数实现(无需自定义递归函数)

如果你希望每个商品单独占一行,保留其他非products字段的关联关系,可以用这个方案:

import pandas as pd
import requests

# 接口请求部分
response = requests.request("POST", url, headers=headers, data=payload).json()
vendas_data = response['vendas']

# 直接展开嵌套的products列表,同时保留其他关联字段
df_pandas = pd.json_normalize(
    vendas_data,
    record_path='products', # 指定要展开的嵌套列表字段
    meta=['store_id', 'id', 'payment'], # 指定要保留的同级非嵌套字段
    record_prefix='product_' # 给展开的商品字段加前缀避免重名
)

# 合并到全局dfa
dfa = pd.concat([dfa, df_pandas], ignore_index=True)
print(dfa)

这个方案生成的DataFrame中,每个商品为独立行,商品的code、lacre等字段会变成product_code、product_lacre列,同时保留对应订单的store_id、id、payment信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:57:02