【问题标题】:Writing dict of dicts of dicts into Excel in certain format using Python使用 Python 以特定格式将 dicts 的 dicts 写入 Excel
【发布时间】:2019-03-31 23:23:54
【问题描述】:

我有一些数据已读入字典词典

编辑:发布原始数据格式

原始数据是每个用户每个月一个excel文件

Alpha - 2018 年 1 月 .. 以下格式

             Score
English        70
Social Science 80
Maths          90
History        45
Science        50

我将所有这些 excel 读入 python 并将它们放入字典中,如下所述。有些学生可能会错过一些考试,因此在这几个月里他们的数据将会丢失。因此,对于少数学生来说,变化将是完整的月份数据缺失。

{alpha: {u'Jan-2018': {'Eng': '70', 'math': '90', 'sci': '50'}, u'feb-2018': {'Eng': '75', 'math': '85', 'sci': '60'}, u'mar-2018': {'Eng': '60', 'math': '92', 'sci': '40'}}

{beta : {u'Jan-2018': {'Eng': '30', 'math': '50', 'sci': '40'}, u'feb-2018': {'Eng': '55', 'math': '45', 'sci': '70'}, u'may-2018': {'Eng': '50', 'math': '52', 'sci': '45'}}

{gamma : {u'Jan-2018': {'Eng': '50', 'math': '50', 'sci': '40'}, u'feb-2018': {'Eng': '55', 'math': '75', 'sci': '40'}, u'may-2018': {'Eng': '56', 'math': '59', 'sci': '35'}}

我想在 Excel 上以下列格式获取这些内容。在表格 1 上,它应该只发布不同月份的 Eng 数据,在第二张表格上发布数学数据和第三张 sci 数据。对于某人数据丢失的任何月份,应该留空或可能为 0

Sheet1(Eng):
        Jan-2018        Feb-2018        Mar-2018        May-2018
alpha       70          75                60            0   
beta        30          55                 0            50
gamma       50          55                 0            56

其他两张类似。

我试过下面的代码,但是有两个问题:

  1. 不考虑缺失月份,按顺序打印
  2. 它不会在每一列的顶部打印月份名称

    List1 包含上述字典的字典

    alleng    = {}
    allmath   = {}
    allsci    = {}
    
    for i in list1:
        englist  = []   
        mathlist = []
        scilist  = []
    
        for m in list1[i]:
            for h in list1[i][m]:
                value1 = list1[i][m][h]
                if h == 'Eng':
                    englist.append(value1)
                if h == 'Math':
                    mathlist.append(value1)
                if h == 'Sci':
                    scilist.append(value1)
    
        alleng[i]     = englist 
        allmath[i]    = mathlist
        allsci[i]     = scilist 
    
    writer = ExcelWriter('final-sheet.xlsx')
    
    frame = pd.DataFrame.from_dict(allsci, orient='index')
    frame = frame.transpose()
    frame = frame.transpose()
    frame.to_excel(writer , sheet_name = 'Sci')
    
    frame1 = pd.DataFrame.from_dict(alleng, orient='index')
    frame1 = frame1.transpose()
    frame1 = frame1.transpose()
    frame1.to_excel(writer , sheet_name = 'Eng')
    
    frame2 = pd.DataFrame.from_dict(allmath, orient='index')
    frame2 = frame2.transpose()
    frame2 = frame2.transpose()
    frame2.to_excel(writer , sheet_name = 'Math')
    

我也尝试使用以下解决方案,但没有帮助:

Dict of dicts of dicts to DataFrame

【问题讨论】:

  • 我对数据的原始来源更感兴趣,它是什么样的,以及你为什么要分这么多步骤来做这件事。可能有比转换为字典然后转换回 Excel 更好的方法来处理这个问题。数据的来源是什么?您还提到缺少月份等;如果样本数据更能代表此数据集中可能发生的变化,则它可能会更有帮助。
  • 我每个月都会为 alpha、beta 和 gamma 等用户获得多张 Excel 表格。我从这些excel中读取他们的数据并转换为字典(list1)。然后必须明智地对这个数据主体进行分类,这就是我苦苦挣扎的地方。我粘贴的代码 sn-p 肯定是更长的路,应该有一些东西是 Pandas 转换为所需格式的数据帧。在其中一个解决方案上发现了这一点,但是它本身在一张纸上提供了所有内容,尽管它按行对数据进行排序 --- pd.concat({k: pd.DataFrame(v) for k, v in list1.items() })

标签: excel python-2.7


【解决方案1】:

我尝试following code 将 dicts 转换为数据帧,它有帮助

df1=pd.DataFrame(list1).stack().apply(pd.Series).unstack()

它将以以下格式在单张纸上提供数据:

            Jan-2018   feb-2018   mar-2018  april-2018 
Eng  Alpha    70            75          60          0
     Beta     30            55          0           50
     Gamma    50            55          0           56

Math Alpha    90            85          92          0
     Beta     50            45          0           52
     Gamma    50            75          0           59

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2018-04-30
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2021-07-25
    • 2018-07-10
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多