如何高效将含字典列表的嵌套字典转换为Pandas DataFrame?
高效转换嵌套字典为目标格式DataFrame的方案
核心思路
利用Pandas内置的pd.json_normalize(用于展平字典列表)和pd.concat(用于合并多个小DataFrame)实现高效转换,避免纯Python循环的低效问题。
代码实现
1. 示例数据
import pandas as pd # 构造符合你结构的示例数据 data = { 'person1': { 'category1': [ {'time': 'time1', 'property1': 'value1', 'property2': 'value2'}, {'time': 'time2', 'property1': 'value3', 'property2': 'value4'} ], 'category2': [ {'time': 'time5', 'property1': 'value9', 'property2': 'value10'} ] }, 'person2': { 'category1': [ {'time': 'time3', 'property1': 'value5', 'property2': 'value6'}, {'time': 'time4', 'property1': 'value7', 'property2': 'value8'} ] } }
2. 转换代码(简洁版)
# 用列表推导式生成所有person-category对应的DataFrame,再合并 final_df = pd.concat( [ pd.json_normalize(records).assign(person=person, category=category) for person, categories in data.items() for category, records in categories.items() ], ignore_index=True ) # 调整列顺序,将time、person、category移至前列 cols = ['time', 'person', 'category'] + [col for col in final_df.columns if col not in ['time', 'person', 'category']] final_df = final_df[cols]
3. 输出结果
执行后得到的final_df结构完全符合你的要求:
time person category property1 property2 0 time1 person1 category1 value1 value2 1 time2 person1 category1 value3 value4 2 time5 person1 category2 value9 value10 3 time3 person2 category1 value5 value6 4 time4 person2 category1 value7 value8
方案优势
- 高效性:
json_normalize和pd.concat都是Pandas底层优化的向量操作,比纯Python循环效率高得多,尤其适合处理大规模数据。 - 兼容性强:自动识别字典中的所有
property字段,不管有多少个属性列,都能自动展开,无需手动指定字段。 - 简洁易维护:代码逻辑清晰,无需复杂的循环嵌套,便于后续修改和扩展。
内容的提问来源于stack exchange,提问作者Horse
相关产品推荐
相关产品推荐

