将Excel数据转换为嵌套的字典和列表

时间:2018-09-26 06:50:35

标签: python excel dictionary data-structures

这与我昨天的问题几乎一样。但是我认为使用唯一的值列表来创建嵌套的字典和列表结构是理所当然的。但是后来,我想到了一个问题,即如何从excel数据中逐行构建这种dict&list结构(称为数据结构)。

excel文件(一个文件夹中的多个文件)全部如下所示:

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

我想要的字典和列表结构是

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':[]},依此类推。关键是,对于每个CategorySubcategory值,Main Dish在excel中有三个条目,但在数据结构中只需要1,而Drink在excel中有两个条目,但数据结构中只有1个。对于嵌套在类别列表中的每个子类别,它们遵循相同的规则,只有唯一的值应嵌套到类别中。然后,每个对应的Name菜肴,都将根据其类别和子类别进入数据结构。

问题是,我找不到将数据转换为此数据结构的更好方法。另外,在Name列之后还有其他列。因此,它有点复杂。我当时想首先从类别和子类别的整个列中提取唯一值,这简化了过程,但是在填充相应的Name值时会导致问题。如果我是通过逐行方法进行的,那么根据我当前的编程技能,设计一个子类是否存在或类别退出测试以保持唯一值是很困难的...

因此,将这个excel文件转换成这种数据结构的最佳方法是什么?非常感谢。

1 个答案:

答案 0 :(得分:1)

一种方法可能是使用熊猫将excelfile读取到数据框中,然后基于这个出色的答案Pandas convert DataFrame to Nested Json

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))