如何扁平化嵌套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
相关产品推荐
相关产品推荐

