Python 将excel数据转换为嵌套的dict和list
这与我昨天的问题几乎相同。但我认为使用唯一的值列表来创建嵌套的dict&list结构是理所当然的。但是,接下来,我遇到了如何从excel数据逐行构建这个dict&list结构(称为数据结构)的问题 excel文件(文件夹中的多个文件)的外观如下所示:Python 将excel数据转换为嵌套的dict和list,python,excel,dictionary,data-structures,Python,Excel,Dictionary,Data Structures,这与我昨天的问题几乎相同。但我认为使用唯一的值列表来创建嵌套的dict&list结构是理所当然的。但是,接下来,我遇到了如何从excel数据逐行构建这个dict&list结构(称为数据结构)的问题 excel文件(文件夹中的多个文件)的外观如下所示: Category Subcategory Name Main Dish Noodle Tomato Noodle Main Dish Stir Fry Chicken Rice Main Dish
Category Subcategory Name
Main Dish Noodle Tomato Noodle
Main Dish Stir Fry Chicken Rice
Main Dish Soup Beef Goulash
Drink Wine Bordeaux
Drink Softdrink Cola
我想要的dict和list结构是:
data = [0:{'data':0, 'Category':[
{'name':'Main Dish', 'Subcategory':[
{'name':'Noodle', 'key':0, 'data':['key':1, 'title':'Tomato Noodle']},
{'name':'Stir Fry', 'key':1, 'data':['key':2, 'title':'Chicken Rice']},
{'name':'Soup', 'key':2, 'data':['key':3, 'title':'Beef Goulash']}]},
{'name':'Drink', 'Subcategory':[
{'name':'Wine', 'key':0, 'data':['key':1, 'title':'Bordeaux']},
{'name':'Softdrink', 'key':1, 'data':['key':2, 'title':'cola'}]}]},
1:{'data':1, 'Category':.........#Same structure as dataset 0}]
因此,对于每个excel文件,只需循环并设置{'data':0,'Category':[]},{'data':1,'Category':[]}
等即可。关键是,对于每个类别
和子类别
值,主菜
在excel中有三个条目,但在数据结构中只需要一个;饮料
在excel中有两个条目,但在数据结构中只有一个条目。对于嵌套在类别列表中的每个子类别,它们遵循相同的规则,只有唯一的值才能嵌套到类别中。然后,每个对应的菜名
,根据其类别和子类别进入数据结构
问题是,我找不到更好的方法将数据转换为此数据结构。另外,在名称
列之后还有其他列。所以它有点复杂。我想首先从category和subcategory的整个列中提取唯一的值,这简化了过程,但在填充相应的名称值时会出现问题。如果我是从一行一行的方法来做这件事,那么根据我目前的编程技巧,设计一个If子类别存在或类别退出测试来保持唯一的值在某种程度上是困难的
因此,将此excel文件转换为此类数据结构的最佳方法是什么?非常感谢。一种方法可以是使用pandas将excel文件读入数据帧,然后在这个极好的答案的基础上构建
你试过自己做吗?失败的代码在哪里?是的,当测试一个类别是否已经存在时,我总是遇到列表索引超出范围,测试本身变得相当复杂。然后有很多专栏需要做这个测试…所以我开始思考是否有更好的方法
import pandas as pd
excel_file = 'path-to-your-excel.xls'
def fdrec(df):
drec = dict()
ncols = df.values.shape[1]
for line in df.values:
d = drec
for j, col in enumerate(line[:-1]):
if not col in d.keys():
if j != ncols-2:
d[col] = {}
d = d[col]
else:
d[col] = line[-1]
else:
if j!= ncols-2:
d = d[col]
return drec
df = pd.read_excel(excel_file)
print(fdrec(df))