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

如何高效将含字典列表的嵌套字典转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:39:42