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

如何对含共享列的Pandas多层索引DataFrame进行透视转换?

问题:将多层索引的Pandas DataFrame转换为指定结构的字典

我有一个通过以下代码构造的Pandas DataFrame:

import pandas as pd

test_dict = {('a', 1) : {'shared':0,'x':1, 'y':2, 'z':3}, 
            ('a', 2) : {'shared':1,'x':2, 'y':4, 'z':6},
            ('b', 1) : {'shared':0,'x':10, 'y':20, 'z':30},
            ('b', 2) : {'shared':1,'x':100, 'y':200, 'z':300}}
example = pd.DataFrame.from_dict(test_dict).T

希望将其转换为如下结构的字典:

res_dict = {1 : {'shared':0,'a':{'x':1, 'y':2, 'z':3}, 'b':{'x':10, 'y':20, 'z':30}},
            2 : {'shared':1,'a':{'x':2, 'y':4, 'z':6},'b':{'x':100, 'y':200, 'z':300}}}

实现方法

可以通过**分组(groupby)**结合字典推导来实现,以下是两种实用方案:

方法一:分步遍历分组

res_dict = {}
# 按第二层索引(数字1/2)分组
for idx, group in example.groupby(level=1):
    # 提取当前组的shared值(同一组内shared值一致,取第一个即可)
    shared_val = group['shared'].iloc[0]
    # 构建每个字母对应的子字典(排除shared列)
    sub_dict = {row_idx[0]: row.drop('shared').to_dict() for row_idx, row in group.iterrows()}
    # 组合成目标结构
    res_dict[idx] = {'shared': shared_val, **sub_dict}

方法二:简洁链式字典推导

如果追求代码简洁,也可以用一行字典推导完成:

res_dict = {
    idx: {
        'shared': grp['shared'].iloc[0],
        **{k: grp.xs(k, level=0).drop('shared').to_dict() for k in grp.index.get_level_values(0)}
    }
    for idx, grp in example.groupby(level=1)
}

运行上述任意代码后,res_dict都会与目标结构完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:45:37