如何将嵌套字典与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
相关产品推荐
相关产品推荐

