我有一个包含3个级别的嵌套字典
example_d = {'attribute_001': {'colour': {'blue': 5, 'green': 5, 'red': 5},
'country': {'France': 3, 'Germany': 3, 'India': 3, 'UK': 3, 'USA': 3}},
'attribute_002': {'colour': {'blue': 5, 'green': 5, 'red': 5},
'country': {'France': 3, 'Germany': 3, 'India': 3, 'UK': 3, 'USA': 3}},
'attribute_003': {'colour': {'blue': 5, 'green': 5, 'red': 5},
'country': {'France': 3, 'Germany': 3, 'India': 3, 'UK': 3, 'USA': 3}},
'attribute_004': {'colour': {'blue': 5, 'green': 5, 'red': 5},
'country': {'France': 3, 'Germany': 3, 'India': 3, 'UK': 3, 'USA': 3}},
'attribute_005': {'colour': {'blue': 5, 'green': 5, 'red': 5},
'country': {'France': 3, 'Germany': 3, 'India': 3, 'UK': 3, 'USA': 3}}}
我想将其移动到pandas数据框中,以使行索引源自我字典的第一级,并将其余级别用作层次列索引。
我可以通过使用以下内容来适应here的答案:
pd.concat({key:pd.DataFrame.from_dict(example_d[key],orient='columns')
for key in example_d.keys()}).unstack(1)
这给了我
但是我需要多层列索引中的最低层才能尊重他们的父母。
即在colour
标题下,我只希望出现颜色列,在country
标题下,我只希望看到国家/地区列。
答案 0 :(得分:2)
首先更改dictionary,传递给Series
构造函数,然后通过Series.unstack
重塑形状:
reform = {(level1_key, level2_key, level3_key): values
for level1_key, level2_dict in example_d.items()
for level2_key, level3_dict in level2_dict.items()
for level3_key, values in level3_dict.items()}
df = pd.Series(reform).unstack(level=[1,2])
print (df)
colour country
blue green red France Germany India UK USA
attribute_001 5 5 5 3 3 3 3 3
attribute_002 5 5 5 3 3 3 3 3
attribute_003 5 5 5 3 3 3 3 3
attribute_004 5 5 5 3 3 3 3 3
attribute_005 5 5 5 3 3 3 3 3
答案 1 :(得分:1)
IIUC使用concat
df= pd.DataFrame(example_d).T
pd.concat([df[x].apply(pd.Series) for x in list(df)],1,keys=list(df))
Out[540]:
colour country
blue green red France Germany India UK USA
attribute_001 5 5 5 3 3 3 3 3
attribute_002 5 5 5 3 3 3 3 3
attribute_003 5 5 5 3 3 3 3 3
attribute_004 5 5 5 3 3 3 3 3
attribute_005 5 5 5 3 3 3 3 3