如何对含共享列的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
相关产品推荐
相关产品推荐

