如何简洁高效扁平化指定JSON并转换为目标结构DataFrame?
解决JSON转目标DataFrame的简洁方案
针对你不想生成过多列的需求,这里有个非常简洁且符合预期的方法,不需要复杂的循环或过度扁平化,用Python的列表推导式配合pandas就能轻松搞定,完全避开子键过多导致列爆炸的问题。
步骤示例
首先假设你的输入JSON已经加载为Python字典(如果是字符串格式,用json.loads()转一下即可):
import pandas as pd # 输入数据(已转为Python字典) data = { "key1": "value1", "key2": "value2", "key3": { "value11": [{"id": "a1", "name": "b1"}], "value22": [{"id": "a2", "name": "b2"}, {"id": "a4", "name": "b4"}], "value33": [{"id": "a3", "name": "b3"}] } }
然后用列表推导式预处理数据,把key3的每个子键作为col_3的值,同时展开每个子键对应的列表项:
# 预处理生成符合目标结构的字典列表 processed_data = [ { "col_1": data["key1"], "col_2": data["key2"], "col_3": key3_subkey, **item # 展开列表中的id、name字段 } for key3_subkey, item_list in data["key3"].items() for item in item_list ] # 转成目标DataFrame df = pd.DataFrame(processed_data)
运行后得到的df就是你想要的结构:
| col_1 | col_2 | col_3 | id | name |
|---|---|---|---|---|
| value1 | value2 | value11 | a1 | b1 |
| value1 | value2 | value22 | a2 | b2 |
| value1 | value2 | value22 | a4 | b4 |
| value1 | value2 | value33 | a3 | b3 |
为什么这个方案适合你?
- 避免列爆炸:不管
key3下有多少个子键,最终只会生成固定的5列,完全符合你不想因子键过多生成大量列的需求。 - 简洁高效:用列表推导式完成预处理,代码可读性高,执行效率也不错,不需要依赖额外小众工具(pandas是数据分析领域的常用包,属于常规工具范畴)。
- 灵活扩展:如果后续
key3的子结构有小变化(比如新增字段),只需要调整**item部分或者添加字段映射即可快速适配。
内容的提问来源于stack exchange,提问作者seriously divergent
相关产品推荐
相关产品推荐

