如何从带有列表的嵌套字典构建一个带有MultiIndex的Pandas DataFrame

6
我有以下字典。
d= {'key1': {'sub-key1': ['a','b','c','d','e']},
    'key2': {'sub-key2': ['1','2','3','5','8','9','10']}}

这篇文章的帮助下,我成功地将这个字典转换为了数据框。

df = pd.DataFrame.from_dict({(i,j): d[i][j] 
                            for i in d.keys() 
                            for j in d[i].keys()},
                            orient='index')

然而,我的数据框架采用以下形式:

                  0  1  2  3  4     5     6
(key1, sub-key1)  a  b  c  d  e  None  None
(key2, sub-key2)  1  2  3  5  8     9    10

我可以使用元组作为索引值,但我认为最好使用多级DataFrame。像这样的帖子帮助我分两步创建它,但我很难在一步中完成(即从初始创建开始),因为字典中的列表以及之后的元组都增加了复杂度。


所以你已经有一个可行的解决方案,想要改进你的代码?请发布你的工作解决方案,并使用https://codereview.stackexchange.com/。 - WNG
2
你已经创建了什么?使用df.index = pd.MultiIndex.from_tuples(df.index) - Zero
1
@Zero 好久不见了,你最近在哪里呢? - Bharath M Shetty
2个回答

18

我认为你的想法接近了,因为 MultiIndex 可以使用 MultiIndex.from_tuples 方法:

d = {(i,j): d[i][j] 
       for i in d.keys() 
       for j in d[i].keys()}

mux = pd.MultiIndex.from_tuples(d.keys())
df = pd.DataFrame(list(d.values()), index=mux)
print (df)
               0  1  2  3  4     5     6
key1 sub-key1  a  b  c  d  e  None  None
key2 sub-key2  1  2  3  5  8     9    10

感谢Zero提供的另一种解决方案:

df = pd.DataFrame.from_dict({(i,j): d[i][j] 
                            for i in d.keys() 
                            for j in d[i].keys()},
                            orient='index')

df.index = pd.MultiIndex.from_tuples(df.index)
print (df)
               0  1  2  3  4     5     6
key1 sub-key1  a  b  c  d  e  None  None
key2 sub-key2  1  2  3  5  8     9    10

先生,我现在看到了@Zero的评论。如果您更新答案,可以添加他的名字。 - Bharath M Shetty
一个改进。只需 mux = pd.MultiIndex.from_tuples(d)。类似于 for k in dictionary... 迭代其键而不是键 / 值对的方式。 - Brad Solomon
@Bharath,我只是好奇为什么我们不在数据框中进行修改...而不是在字典中... - BENY

3

我将使用stack来处理两层嵌套的dict....

df=pd.DataFrame(d)

df.T.stack().apply(pd.Series)
Out[230]: 
               0  1  2  3  4    5    6
key1 sub-key1  a  b  c  d  e  NaN  NaN
key2 sub-key2  1  2  3  5  8    9   10

@Bharath同样...我只是好奇......为什么我们需要修改字典....就个人而言,我不喜欢重构字典,,, - BENY
可能是因为它采用了多级索引的方式,所以比转置和应用更快。 - Bharath M Shetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接