【问题标题】:Converting excel data to nested dict and list将excel数据转换为嵌套字典和列表
【发布时间】:2019-03-01 20:51:57
【问题描述】:

这与我昨天的问题几乎相同。但我认为使用唯一值列表来创建嵌套的字典和列表结构是理所当然的。但是后来,我遇到了如何从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

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

问题是,我找不到将数据转换为此数据结构的更好方法。另外,Name 列之后还有其他列。所以它有点复杂。我想先从整个类别和子类别的列中提取唯一值,这样可以简化过程,但是在填写相应的名称值时会出现问题。如果我是逐行执行此操作,那么根据我当前的编程技能,设计一个是否存在子类别或类别退出测试以保持唯一值在某种程度上是困难的......

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

【问题讨论】:

  • 你试过自己做吗?失败的代码在哪里?
  • 是的,在测试一个类别是否已经存在的时候,我总是遇到列表索引超出范围,测试本身变得相当复杂。然后有很多列需​​要做这个测试......所以我开始思考是否有更好的方法

标签: python excel dictionary data-structures


【解决方案1】:

一种方法是使用 pandas 将 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2017-07-29
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多