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

将嵌套字典转换为带节点层级的Pandas DataFrame

嵌套字典转多级ID+Amounts的DataFrame解决方案

给定如下嵌套字典:

{
    8582: {
        "Amounts": 35892,
        8586: {
            "Amounts": 8955,
            8590: {"Amounts": 399},
            8674: {"Amounts": 111},
            8589: {"Amounts": 8445},
        },
        8585: {"Amounts": 13232, 8588: {"Amounts": 3884}, 8587: {"Amounts": 9348}},
        8593: {"Amounts": 8559, 8583: {"Amounts": 8559}},
        8584: {"Amounts": 5146, 8597: {"Amounts": 5146}},
    }
}

需求是将其转换为DataFrame:

  • 所有层级的ID(非"Amounts"的键)作为独立列,层级数不固定(最多17级)
  • 最后一列对应"Amounts"的数值

尝试过的无效方法

方法一

import pandas as pd

df = pd.DataFrame.from_dict([[k1, k2, v]
              for k1,d in data.items()
              for k2,v in d.items()])

方法二

import pandas as pd

def flatten_dict(d, parent_keys = None):
    if parent_keys is None:
        parent_keys = []

    items = []
    for k, v in d.items():
        keys = parent_keys + [k]
        if isinstance(v, int):
            items.append({"Keys": keys, "Amounts": v})
        else:
            items.extend(flatten_dict(v, keys))
    return items

flat_data = flatten_dict(data)
df = pd.DataFrame(flat_data)

正确转换方案

核心思路:遍历字典时记录每一层ID,遇到Amounts时生成包含所有层级ID和对应数值的记录,最后统一补全到最大层级数的列数,缺失ID用NaN填充。

import pandas as pd
import numpy as np

def flatten_nested_dict(d, current_ids=None):
    if current_ids is None:
        current_ids = []
    records = []
    
    for key, value in d.items():
        if key == "Amounts":
            # 生成记录:当前所有ID + Amount值
            records.append(current_ids + [value])
        else:
            # 递归遍历子ID
            records.extend(flatten_nested_dict(value, current_ids + [key]))
    
    return records

# 原始字典
data = {
    8582: {
        "Amounts": 35892,
        8586: {
            "Amounts": 8955,
            8590: {"Amounts": 399},
            8674: {"Amounts": 111},
            8589: {"Amounts": 8445},
        },
        8585: {"Amounts": 13232, 8588: {"Amounts": 3884}, 8587: {"Amounts": 9348}},
        8593: {"Amounts": 8559, 8583: {"Amounts": 8559}},
        8584: {"Amounts": 5146, 8597: {"Amounts": 5146}},
    }
}

# 扁平化得到所有记录
flat_records = flatten_nested_dict(data)

# 确定最大ID层级数
max_level = max(len(record)-1 for record in flat_records)

# 补全记录的ID列,不足部分用NaN填充
filled_records = []
for record in flat_records:
    ids = record[:-1]
    amount = record[-1]
    filled_ids = ids + [np.nan]*(max_level - len(ids))
    filled_records.append(filled_ids + [amount])

# 生成DataFrame并设置列名
columns = [f"ID_{i+1}" for i in range(max_level)] + ["Amounts"]
df = pd.DataFrame(filled_records, columns=columns)

print(df)

最终输出

ID_1   ID_2   ID_3  Amounts
0  8582    NaN    NaN    35892
1  8582  8586.0    NaN     8955
2  8582  8586.0  8590.0      399
3  8582  8586.0  8674.0      111
4  8582  8586.0  8589.0     8445
5  8582  8585.0    NaN    13232
6  8582  8585.0  8588.0     3884
7  8582  8585.0  8587.0     9348
8  8582  8593.0    NaN     8559
9  8582  8593.0  8583.0     8559
10 8582  8584.0    NaN     5146
11 8582  8584.0  8597.0     5146

内容的提问来源于stack exchange,提问作者Gogo78

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:17:32