Dict = {'Things' : {'Car':'Lambo', 'Home':'NatureVilla', 'Gadgets':{'Laptop':{'Programs':{'Data':'Excel', 'Officework': 'Word', 'Coding':{'Python':'PyCharm', 'Java':'Eclipse', 'Others': 'SublimeText'}, 'Wearables': 'SamsungGear', 'Smartphone': 'Nexus'}, 'clothes': 'ArmaaniSuit', 'Bags':'TravelBags'}}}}
d = {(i,j,k,l,m,n): Dict[i][j][k][l][m][n]
for i in Dict.keys()
for j in Dict[i].keys()
for k in Dict[j].keys()
for l in Dict[k].keys()
for m in Dict[l].keys()
for n in Dict[n].keys()
}
mux = pd.MultiIndex.from_tuples(d.keys())
df = pd.DataFrame(list(d.values()), index=mux)
print (df)
我已经做过的事情: 我尝试使用pandas对这个不规则数据进行多重索引,但我在'Car'获得了KeyError。然后我尝试处理异常并试图通过它,但然后它导致语法错误。所以我可能会失去方向。如果有任何其他模块或方式,我可以索引这些不规则数据,并以某种方式将其放在表中。我有一大堆像这样的原始数据。
我想做什么: 我想在QTableView中使用这些数据进行打印,这是来自PyQt5(使用GUI制作程序)。
条件: 此数据每小时都会从API更新。
到目前为止我一直在想: 可能是我可以将所有这些数据附加到MySQL。但是当这个数据从API更新时,只有值会改变,其余的KEYS将是相同的。但那时需要更多的空间。
参考文献: How to convert a 3-level dictionary to a desired format?
How to build a MultiIndex Pandas DataFrame from a nested dictionary with lists
任何帮助将不胜感激。感谢您阅读此问题。
答案 0 :(得分:0)
您的信息看起来很像json,以及API返回的内容。如果是这样,并且你把它变成了字典,那么你最好使用python的json库,甚至是panda构建的read_json格式。
答案 1 :(得分:0)
您引用的3级示例中的数据实际上不是6级字典,而是字典。区别在于:您的词典具有多个不同级别的数据,例如: '兰博'价值是关键的第二层次('事物'' Car')但是' Eclipse'价值是第六层次的关键('事物''小工具''笔记本电脑''程序''编码''爪哇&#39)
如果你想“变平”'您的结构需要决定如何处理'错过'更重要的关键值,例如' Lambo'。
不过,也许它实际上并不是解决您问题的方法,也许您需要使用更合适的UI小部件(如TreeView)来处理这种分层数据,但我会尝试直接解决您的确切问题< / strong>即可。不幸的是,在一个简单的dict或list comprehension语句中统一引用所有不同的级别值似乎并不容易。
只需看看您的价值提取器&#39; (Dict[i][j][k][l][m][n]
)i,j,k,l,m,n不存在这样的值,它允许你得到一个&#39; Lambo&#39;。因为要获得一个兰博,你需要使用Dict['Things']['Car']
(具有讽刺意味的是,在现实生活中,获得兰博可能也很困难:-))
解决任务的一种简单方法是: 提取第二级数据,提取第三级数据,等等,并将它们组合在一起。 例如。要提取第二级值,您可以编写如下内容:
val_level2 = {(k1,k2):Dict[k1][k2]
for k1 in Dict
for k2 in Dict[k1]
if isinstance(Dict[k1],dict) and
not isinstance(Dict[k1][k2],dict)}
但是如果你想稍后将它与六个级别的值组合在一起,则需要为你的关键元组添加一些填充:
val_level2 = {(k1,k2,'','','',''):Dict[k1][k2]
for k1 in Dict
for k2 in Dict[k1]
if isinstance(Dict[k1],dict) and
not isinstance(Dict[k1][k2],dict)}
稍后您可以通过以下方式将所有内容组合在一起:
d = {}
d.update(val_level2)
d.update(val_level3)
但通常使用分层数据最有机的方法是使用一些递归,如下所示:
def flatten_dict(d,key_prefix,max_deep):
return [(tuple(key_prefix+[k]+['']*(max_deep-len(key_prefix))),v)
for k,v in d.items() if not isinstance(v,dict)] +\
sum([flatten_dict(v,key_prefix+[k],max_deep)
for k,v in d.items() if isinstance(v,dict)],[])
后来用这样的代码:
d={k:v for k,v in flatten_dict(Dict,[],5)}
mux = pd.MultiIndex.from_tuples(d.keys())
df = pd.DataFrame(list(d.values()), index=mux)
df.reset_index()
我实际上是用你的数据得到了这个结果:
P.S。根据{{3}},我们更喜欢使用lowercase_with_underscores作为变量名,CapWords适用于类。所以在你的情况下,src_dict会比Dict好得多。