pandas规范化嵌套字典时如何保留外层键生成目标DataFrame
pandas嵌套字典转DataFrame展开列表列解决方案
问题原因
你原有代码只提取了字典的value部分传入json_normalize,完全丢弃了外层字典的键,因此最终结果缺失code列。另外你提供的示例字典存在语法错误:'name': ABC'缺少前引号,修正后字典结构为:
dictionary = { '101020': {'name': 'HJ', 'grades': [90, 80, 70]}, '101520': {'name': 'ABC', 'grades': [100, 40, 70]} }
可直接运行的实现代码
推荐不对原字典做修改的写法,避免污染原始数据:
import pandas as pd # 构造记录时将外层字典键作为code字段合并到每条记录中 records = [{"code": code, **inner_info} for code, inner_info in dictionary.items()] # 调用json_normalize,将code、name都作为元数据字段传入,展开grades列表 df = pd.json_normalize( records, record_path="grades", meta=["name", "code"] ).rename(columns={0: "grades"})[["code", "name", "grades"]] print(df)
运行输出结果
执行后得到的DataFrame完全匹配你的预期结构:
code name grades 0 101020 HJ 90 1 101020 HJ 80 2 101020 HJ 70 3 101520 ABC 100 4 101520 ABC 40 5 101520 ABC 70
写法说明
- 列表推导式
[{"code": code, **inner_info} for code, inner_info in dictionary.items()]会遍历字典的键值对,把外层键作为code字段和内层的name、grades字段合并成新的单条记录,不会修改原始字典内容 json_normalize的meta参数用来指定不需要展开、需要整行保留的字段,这里把name和code都传入即可保留两列内容- 因为
grades展开后默认列名是0,最后通过rename改成目标列名grades,再调整列顺序就完成了
内容的提问来源于stack exchange,提问作者hjun
相关产品推荐
相关产品推荐

