如何为Pandas DataFrame规范化深度嵌套的JSON彩妆产品数据
解决彩妆产品颜色变体提取问题
目标格式示例
最终要生成的DataFrame结构如下(每个产品一行,颜色变体对应列存为列表):
| product_id | product_name | color_names | color_hex_codes | variant_skus |
|---|---|---|---|---|
| 1 | 哑光口红 | ['复古红', '豆沙色'] | ['#C41E3A', '#B08968'] | ['LIP001-R', 'LIP001-B'] |
| 2 | 高光粉饼 | ['香槟金', '月光银', '古铜棕'] | ['#FADADD', '#E8F4F8', '#D2B48C'] | ['HIG001-C', 'HIG001-S', 'HIG001-T'] |
先明确数据结构前提
假设你的原始嵌套数据结构如下(匹配你提到的已验证可访问字段):
raw_data = [ { "product_id": 1, "product_name": "哑光口红", "variants": [ {"color_name": "复古红", "hex": "#C41E3A", "sku": "LIP001-R"}, {"color_name": "豆沙色", "hex": "#B08968", "sku": "LIP001-B"} ] }, { "product_id": 2, "product_name": "高光粉饼", "variants": [ {"color_name": "香槟金", "hex": "#FADADD", "sku": "HIG001-C"}, {"color_name": "月光银", "hex": "#E8F4F8", "sku": "HIG001-S"}, {"color_name": "古铜棕", "hex": "#D2B48C", "sku": "HIG001-T"} ] } ]
方案1:修复手动嵌套循环问题
你之前手动循环出错,大概率是没给每个产品单独生成变体列表,而是把所有产品的变体合并到了同一个列表里。按以下方式遍历即可:
import pandas as pd processed_data = [] for product in raw_data: # 为每个产品单独提取基础信息和变体列表 product_entry = { "product_id": product["product_id"], "product_name": product["product_name"], "color_names": [var["color_name"] for var in product["variants"]], "color_hex": [var["hex"] for var in product["variants"]], "variant_skus": [var["sku"] for var in product["variants"]] } processed_data.append(product_entry) # 转换为目标DataFrame df = pd.DataFrame(processed_data)
方案2:解决json_normalize的KeyError问题
KeyError通常是因为部分产品缺失variants字段,或者路径拼写错误。用errors='ignore'忽略缺失字段,再通过分组聚合回列表格式:
# 先扁平化变体数据,保留产品元数据 flat_variants = pd.json_normalize( raw_data, record_path="variants", # 替换成你实际的变体嵌套路径 meta=["product_id", "product_name"], # 替换成你需要保留的产品字段 errors="ignore" # 跳过缺失变体的产品,避免报错 ) # 按产品分组,将每个变体字段聚合为列表 df = flat_variants.groupby(["product_id", "product_name"]).agg( color_names=("color_name", list), color_hex=("hex", list), variant_skus=("sku", list) ).reset_index()
常见问题排查
- 若仍报KeyError:检查
record_path的路径是否与原始数据完全一致,比如是不是color_variants而非variants?可以用print(raw_data[0].keys())确认顶级字段,print(raw_data[0]["variants"][0].keys())确认变体内部字段。 - 若得到单一列表:手动循环时不要将所有产品的变体追加到全局列表,要为每个产品单独生成变体列表后再加入
processed_data。
内容的提问来源于stack exchange,提问作者Dodecadoofus
相关产品推荐
相关产品推荐

