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

Python新手求助:如何用Pandas正确标准化多值嵌套JSON数据

解决Python中JSON多值嵌套拆分独立记录的问题

嘿,我完全懂你现在的困扰!刚接触Python处理JSON的时候,遇到这种多值嵌套的结构确实容易懵——之前处理单个嵌套值顺风顺水,突然碰到一堆子字典要拆成独立记录,一下子就卡壳了对吧?别担心,咱们用简单的Python代码就能搞定这个事儿。

先明确需求场景

假设你的原始数据是这样的(我模拟了一个更完整的例子,方便你对照):

original_data = {
    "symbol": "AAPL",
    "date": "2024-05-20",
    "price_data": [
        {"c": "119.743", "h": "119.891", "l": "119.249", "o": "119.341"},
        {"c": "120.123", "h": "120.456", "l": "119.876", "o": "119.987"},
        {"c": "121.001", "h": "121.234", "l": "120.567", "o": "120.678"}
    ]
}

你的目标是把price_data里的3个子字典拆成3条独立记录,每条记录都保留symbol和date这两个公共字段,最终得到这样的结果:

[
    {"symbol": "AAPL", "date": "2024-05-20", "c": "119.743", "h": "119.891", "l": "119.249", "o": "119.341"},
    {"symbol": "AAPL", "date": "2024-05-20", "c": "120.123", "h": "120.456", "l": "119.876", "o": "119.987"},
    {"symbol": "AAPL", "date": "2024-05-20", "c": "121.001", "h": "121.234", "l": "120.567", "o": "120.678"}
]

解决方案代码

用Python的字典推导式和列表推导式就能轻松实现,代码简洁又高效:

# 原始数据(替换成你实际的数据)
original_data = {
    "symbol": "AAPL",
    "date": "2024-05-20",
    "price_data": [
        {"c": "119.743", "h": "119.891", "l": "119.249", "o": "119.341"},
        {"c": "120.123", "h": "120.456", "l": "119.876", "o": "119.987"},
        {"c": "121.001", "h": "121.234", "l": "120.567", "o": "120.678"}
    ]
}

# 第一步:提取所有公共字段(除了嵌套的多值字段)
common_fields = {key: value for key, value in original_data.items() if key != "price_data"}

# 第二步:遍历嵌套的子字典,和公共字段合并成独立记录
split_records = [
    {**common_fields, **nested_item}
    for nested_item in original_data["price_data"]
]

# 打印结果验证
for record in split_records:
    print(record)

代码解释

  1. 提取公共字段:用字典推导式筛选出除了嵌套字段(这里是price_data)之外的所有键值对,这样不管你有多少个公共字段,都能一次性获取,不用手动一个个写。
  2. 合并生成记录:用列表推导式遍历每个嵌套的子字典,通过**解包操作把公共字段和子字典合并成一个新字典——这是Python 3.5+支持的语法,非常方便。
  3. 如果是多个主字典的列表:如果你的原始数据是多个像original_data这样的字典组成的列表,只需要再套一层循环就行:
original_list = [
    {"symbol": "AAPL", "date": "2024-05-20", "price_data": [...]},
    {"symbol": "MSFT", "date": "2024-05-20", "price_data": [...]}
]

final_result = []
for data in original_list:
    common = {k: v for k, v in data.items() if k != "price_data"}
    final_result.extend([{**common, **item} for item in data["price_data"]])

注意事项

  • 记得把代码里的price_data替换成你实际的嵌套字段名称,比如如果你的字段叫details,就改成对应的名字。
  • 如果你用的是Python 3.4及以下版本(现在很少见了),可以用dict(common_fields, **nested_item)来代替{**common_fields, **nested_item},效果是一样的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:27:38