如何从带有列表的嵌套字典构建 MultiIndex Pandas DataFrame
Posted
技术标签:
【中文标题】如何从带有列表的嵌套字典构建 MultiIndex Pandas DataFrame【英文标题】:How to build a MultiIndex Pandas DataFrame from a nested dictionary with lists 【发布时间】:2018-05-05 02:16:24 【问题描述】:我有以下字典。
d= 'key1': 'sub-key1': ['a','b','c','d','e'],
'key2': 'sub-key2': ['1','2','3','5','8','9','10']
在this 帖子的帮助下,我成功地将这个字典转换为DataFrame。
df = pd.DataFrame.from_dict((i,j): d[i][j]
for i in d.keys()
for j in d[i].keys(),
orient='index')
但是,我的 DataFrame 采用以下形式:
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 会更好。诸如this one之类的帖子帮助我分两步创建它,但是我很难一步完成(即从最初的创建开始),因为字典中的列表以及之后的元组正在添加一个级别并发症。
【问题讨论】:
那么您已经有了一个可行的解决方案并想改进您的代码?请发布您的工作解决方案,并使用codereview.stackexchange.com 在您已经创建的内容上使用df.index = pd.MultiIndex.from_tuples(df.index)
?
@Zero 好久不见了。你去哪儿了?
【参考方案1】:
我认为你很接近,因为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 的评论了。如果你更新答案,你可以添加他的名字 一项改进。只需mux = pd.MultiIndex.from_tuples(d)
。类似于 for k in dictionary...
迭代其键而不是键/值对的方式。
@Bharath 只是好奇为什么我们不在数据框内进行修改......而不是在字典中......【参考方案2】:
我将使用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 也......我只是好奇......为什么我们需要修改字典......我个人不喜欢重建字典 ,,, 可能是因为它的多索引方式,它会比转置和应用快得多以上是关于如何从带有列表的嵌套字典构建 MultiIndex Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
从字典列表创建 Pandas MultiIndex 的最佳方法是啥?
我需要从包含列表的字典中使用 MultiIndex 在 Pandas 中创建一个 DataFrame