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)
代码解释
- 提取公共字段:用字典推导式筛选出除了嵌套字段(这里是
price_data)之外的所有键值对,这样不管你有多少个公共字段,都能一次性获取,不用手动一个个写。 - 合并生成记录:用列表推导式遍历每个嵌套的子字典,通过
**解包操作把公共字段和子字典合并成一个新字典——这是Python 3.5+支持的语法,非常方便。 - 如果是多个主字典的列表:如果你的原始数据是多个像
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
相关产品推荐
相关产品推荐

