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

如何将Takealot卖家API返回的嵌套JSON完整转为Pandas Dataframe

解决方案

直接用pandas内置的json_normalize结合字段展开、合并操作即可实现,不需要额外依赖。核心逻辑是先保留上层基础字段,再逐个展开嵌套的数组字段,最后按商品唯一标识tsin_id和offer_id合并。

完整修改后代码

import pandas as pd
from pandas import json_normalize
import requests as rq
from datetime import datetime
from functools import reduce

# API信息
url = "https://seller-api.takealot.com/v2"
endpoint = "/offers?"
api_key = "Key xyz"

header = {
        'Authorization': api_key
}

full_url = url + endpoint
    
response = rq.get(full_url, headers=header)
# 增加响应状态校验,避免接口报错导致后续逻辑崩溃
if response.status_code != 200:
    print(f"接口请求失败,状态码:{response.status_code},错误信息:{response.text}")
    exit()

# 直接用requests内置的json解析,不需要额外用json库加载
info = response.json()
df = json_normalize(info["offers"])

# 定义嵌套字段展开通用方法
def expand_nested_col(df, col_name, prefix):
    # 炸开列表结构,每个数组元素生成一行
    exploded = df[['tsin_id', 'offer_id', col_name]].explode(col_name, ignore_index=True)
    # 展开字典结构,统一加前缀避免字段重名
    expanded = json_normalize(exploded[col_name]).add_prefix(f"{prefix}.")
    # 关联主键返回
    return pd.concat([exploded[['tsin_id', 'offer_id']], expanded], axis=1)

# 筛选不包含嵌套数组的基础字段
base_cols = [col for col in df.columns if col not in ['leadtime_stock', 'stock_at_takealot', 'stock_on_way', 'stock_cover', 'sales_units']]
df_base = df[base_cols]

# 逐个处理需要展开的嵌套字段
df_leadtime = expand_nested_col(df, 'leadtime_stock', 'leadtime_stock')
df_takealot_stock = expand_nested_col(df, 'stock_at_takealot', 'stock_at_takealot')
df_onway_stock = expand_nested_col(df, 'stock_on_way', 'stock_on_way')
df_stock_cover = expand_nested_col(df, 'stock_cover', 'stock_cover')
df_sales_units = expand_nested_col(df, 'sales_units', 'sales_units')

# 按主键合并所有表,得到最终全量展开的DataFrame
dfs = [df_base, df_leadtime, df_takealot_stock, df_onway_stock, df_stock_cover, df_sales_units]
df_final = reduce(lambda left, right: pd.merge(left, right, on=['tsin_id', 'offer_id'], how='left'), dfs)

# 可打印查看字段
print(df_final.columns.tolist())
# 结束时间
print(datetime.now().strftime('%H:%M:%S'))

效果说明

  • 所有嵌套字段会自动加前缀避免重名,比如leadtime_stock下的仓库ID会生成字段名leadtime_stock.merchant_warehouse.warehouse_id
  • 如果单个商品对应多个仓库的库存数据,会自动拆分为多行,不会丢失数据
  • 不需要的嵌套字段可以直接删除对应expand_nested_col的调用行即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:54:01