如何从三重嵌套字典创建pandas MultiIndex并构造目标DataFrame
解决方案
一、无需手动遍历,直接生成目标MultiIndex DataFrame
pandas支持直接从嵌套字典生成你需要的结构,只需要配合字典推导式即可快速构造,不需要手动拼接MultiIndex、也不需要逐层遍历取值:
import pandas as pd # 你的原始三重嵌套字典 nested_dict = { 0 : {'acc507' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc522' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc551' : {'max' : 1, 'mean' : 2, 'min': 3} }, 1 : {'acc507' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc522' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc551' : {'max' : 1, 'mean' : 2, 'min': 3} }, 2 : {'acc507' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc522' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc551' : {'max' : 1, 'mean' : 2, 'min': 3} }, 3 : {'acc507' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc522' : {'max' : 1, 'mean' : 2, 'min': 3} , 'acc551' : {'max' : 1, 'mean' : 2, 'min': 3} } } # 直接生成目标DataFrame df = pd.DataFrame.from_dict( {(k_val, model): metrics for k_val, model_dict in nested_dict.items() for model, metrics in model_dict.items()}, orient='index' ) # 给MultiIndex命名 df.index.names = ['K-Value', 'Model']
生成的df完全符合你的要求:索引是指定名称的MultiIndex,自带max、mean、min三个数值列。
二、嵌套字典最内层值的访问方法
如果你需要直接操作原始嵌套字典,不需要转DataFrame,有两种可选方案:
- 已知所有层级的key时直接取值,格式为
nested_dict[k_val][model][metric],比如nested_dict[0]['acc507']['max']就能拿到对应数值。 - 需要批量获取所有最内层值时,可以写递归生成器,不需要手动写多层固定循环:
def iter_nested(d, parent_keys=None): parent_keys = parent_keys or [] for k, v in d.items(): current_keys = parent_keys + [k] if isinstance(v, dict): yield from iter_nested(v, current_keys) else: yield (*current_keys, v) # 调用示例,直接获取所有最内层值的层级信息和数值 for k_val, model, metric, value in iter_nested(nested_dict): print(k_val, model, metric, value)
三、更适合的存储结构方案
你当前的三重嵌套字典确实不适合做数据分析、筛选聚合操作,推荐两种替代方案:
- pandas MultiIndex DataFrame:就是上面生成的结构,是Python数据分析场景下的最优选择,筛选、聚合、统计操作都非常简便,比如要查所有K值为1的模型的max值,只需要
df.loc[1, 'max']即可,跨维度聚合也只需要一行groupby代码。 - 扁平化字典列表:如果需要跨语言使用、或者序列化存储到文件,可以把数据转成扁平结构,每个元素对应一条完整的指标记录:
这种结构可以直接存为JSON、CSV格式,不需要处理嵌套,读写都非常方便。flat_data = [ {"K-Value": k_val, "Model": model, **metrics} for k_val, model_dict in nested_dict.items() for model, metrics in model_dict.items() ]
内容的提问来源于stack exchange,提问作者Bigboss01
相关产品推荐
相关产品推荐

