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)我已经做了什么:,我试着用熊猫对这些不规则的数据进行多重索引,但是我在“汽车”上得到了KeyError。然后我尝试处理异常并试图传递它,但随后它会导致语法错误。所以我可能迷失了方向。如果有任何其他模块或方法,我可以索引这些不规则的数据,并以某种方式将其放入表中。我有很多这样的原始数据。
我想要做的是:,我想使用这些数据在QTableView中打印,这是来自PyQt5 (用GUI制作程序)。
条件:--这个数据每小时从API中更新一次。
到目前为止我所想的:可能是,我可以将所有这些数据附加到MySQL。但是,当这些数据从API更新时,只有值才会改变,其余的键将是相同的。但这样就需要更多的空间。
参考资料: 如何将三级词典转换成所需的格式?
如何从包含列表的嵌套字典中构建MultiIndex Pandas DataFrame
任何帮助都将不胜感激。谢谢你阅读这个问题。
发布于 2018-03-01 19:54:27
您的数据实际上不是6级字典,就像您引用的3级示例中的字典一样。不同之处在于:您的字典有多个不同级别的数据。“‘Lambo”值位于带有键的层次结构的第二层(“Things”、“Car”),而“Eclipse”值则位于第六层,即“东西”、“小工具”、“笔记本电脑”、“程序”、“编码”、“Java”)。
如果你想“平缓”你的结构,你将需要决定如何处理‘错过’的键值,为更深层次的值,如‘兰博’。
顺便说一句,也许它实际上并不是解决问题的方法,也许您需要使用更合适的UI小部件(如TreeView )来处理这样的分层数据,但我将尝试直接使用来解决您的确切问题。
不幸的是,在一个简单的dict或list理解语句中统一引用所有不同的级别值似乎并不容易。看看你的“值提取器”(Dict[i][j][k][l][m][n]),没有这样的值,因为i,j,k,l,m,n的存在允许你得到一个'Lambo‘。因为要获得Lambo,您只需要使用Dict['Things']['Car'] (具有讽刺意味的是,在现实生活中也很难获得Lambo :-)
解决您的任务的一个简单方法是:提取第二级数据,提取第三级数据,等等,然后将它们组合在一起。例如,要提取第二级值,可以编写如下内容:
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)}但是,如果您希望稍后将其与6个级别值结合起来,则需要在关键元组中添加一些填充内容:
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()我实际上从你的数据中得到了这个结果:

根据https://www.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions,我们更喜欢变量名的lowercase_with_underscores,CapWords代表类。因此,src_dict比在您的情况下要好得多。
发布于 2018-03-01 15:57:17
您的信息看起来非常像json,这就是API返回的内容。如果是这样,并且正在将其转换为字典,那么我最好使用python的json库,甚至使用熊猫的read_json格式。
https://stackoverflow.com/questions/49052687
复制相似问题