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

如何将嵌套字典与DataFrame合并?求更优实现方案

问题描述

我有如下DataFrame:

df
     name     A     B     C    D
 0   name1   11    12    13   14
 1   name2   21    22    23   24

还有如下嵌套字典:

d = {'name1': {'1': {'0': 9, '1': 0, '2': 0},
               '2': {'0': 14, '1': 8, '2': 10},
               '3': {'0': 0, '1': 5, '2': 0}},
 
     'name2': {'1': {'0': 6, '1': 0, '2': 7},
               '2': {'0': 8, '1': 9, '2': 8},
               '3': {'0': 0, '1': 5, '2': 10}},
 
     'name3': {'1': {'0': 3, '1': 97, '2': 0},
               '2': {'0': 36, '1': 50, '2': 1},
               '3': {'0': 11, '1': 78, '2': 0}}}

期望得到如下结果:

name     A    B     C    D     1     2     3
 0   name1   11    12    13   14    9     14    0
                                    0     8     5
                                    0     10    0
 1   name2   21    22    23   24    6     8     0
                                    0     9     5
                                    7     8     10

我自己写了一段代码实现,但感觉比较粗糙,想找更优的解决方法。我的代码如下:

我的尝试代码
df_d = pd.DataFrame.from_dict({(i,j): d[i][j]
                         for i in d.keys()
                         for j in d[i].keys()},
                         orient='index')
df_d.index.names = ['name','rating']
df_d= df_d.stack().unstack(level='rating')
df_d.reset_index()
df_result = pd.merge(df, df_d, how='left', on='prod_name')
df_result = df_result.reset_index(drop=True).set_index(['name','A', 'B', 'C', 'D'])
更优解决方案

可以利用pandas的内置方法直接转换嵌套结构,避免手动构建字典推导式,步骤更简洁高效:

import pandas as pd

# 将嵌套字典转换为以name为索引的DataFrame
df_d = pd.DataFrame.from_dict(d, orient='index')
# 展开每个列的内层字典,调整索引层级得到目标列结构
df_d = df_d.apply(pd.Series).stack().unstack(level=1).reset_index()
# 和原DataFrame合并,仅保留原df中存在的name
df_result = pd.merge(df, df_d, on='name', how='left')
# 设置多索引,实现前几列跨行显示的效果
df_result = df_result.set_index(['name', 'A', 'B', 'C', 'D'])

说明:

  • 直接用orient='index'读取字典,快速得到以name为索引、1/2/3为列的初始结构,每列值为内层字典。
  • 通过apply(pd.Series)展开内层字典,再用stack()和unstack()调整层级,把1/2/3转为最终的列,原内层的0/1/2索引转为行维度。
  • 合并时注意匹配name列(你的原代码里写错为prod_name,需要修正),最后设置多索引即可实现期望的跨行显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:15:36