【问题标题】:How do I convert a double indexed dictionary to an excel file using one key as row index and the other key as column index?如何使用一个键作为行索引,另一个键作为列索引,将双索引字典转换为 excel 文件?
【发布时间】:2020-01-11 16:47:51
【问题描述】:

我有一个双索引字典,其中一个索引是时间,另一个索引是特定的能源生产机器。运行程序后,连接到键的字典值将是每台机器每小时的燃料消耗值。 现在,我想将其传输到一个 excel 文件中,其中第一个键(时间)作为行值,第二个键(机器类型)作为列值,用相应的值填充单元格。 我怎样才能做到这一点?

我尝试查看 pandas 文档和/或其他不同的解决方案,但它们都不能正常工作。

字典是这样的:

d = {}
d['mach1',1] = 4
d['mach1',2] = 9
d['mach1',3] = 16
d['mach2',1] = 10
d['mach2',2] = 2
d['mach2',3] = 4
d['mach3',1] = 3
d['mach3',2] = 6
d['mach3',3] = 1

我想要一个如下所示的数据库:

    mach1  mach2  mach3
1     4      10     3
2     9       2     6
3    16       4     1

我该怎么做?提前谢谢你,对不起我的英语不好。

【问题讨论】:

    标签: python excel pandas dataframe dictionary


    【解决方案1】:

    乔安德烈,
    以您提供的字典为例:

    1. 检索列和索引的名称:

      col_name = list({x for (x,_) in list(d.keys())}) index = list({y for (_,y) in list(d.keys())})

    2. 为 pandas 格式化数据:

      dd = {i: [] for i in col_name} for (col_id,row_id),v in d.items(): dd[col_id].append(v)

    3. 我创建 df 并设置索引:

      df = pd.DataFrame({ key:pd.Series(value) for key, value in dd.items() }) df.index = index
      # mach1 mach2 mach3
      # 1 4 10 3
      # 2 9 2 6
      # 3 16 4 1

    4. 用 pandas df 做点什么

    5. 将 df 存储到 csv 文件:

      df.to_csv("myData.csv", sep=";")

    6. 用 Excel 打开 csv 并做一些事情

    7. 从 csv 文件加载数据:

      df = pd.read_csv("myData.csv", sep=";", index_col=0)

    完整的代码在这里:

    def my_dict_to_df(d):
        col_name = list({x for (x,_) in list(d.keys())})
        index = list({y for (_,y) in list(d.keys())})
        dd = {i: [] for i in col_name}
        for (col_id,row_id),v in d.items():
            dd[col_id].append(v)
        df = pd.DataFrame({ key:pd.Series(value) for key, value in dd.items() })
        df.index = index
        return df
    
    df = my_dict_to_df(d)
    df.to_csv("myData.csv", sep=";")
    

    编辑:我认为数据已经排序。如果没有这个假设,您需要在开头订购字典dcol_nameindex

    def my_dict_to_df(d):
        d = dict(sorted(d.items()))
        col_name = sorted({x for (x,_) in list(d.keys())})
        index = sorted({y for (_,y) in list(d.keys())})
        dd = {i: [] for i in col_name}
        for (col_id,row_id),v in d.items():
            dd[col_id].append(v)
        df = pd.DataFrame({ key:pd.Series(value) for key, value in dd.items() })
        df.index = index
        return df
    

    注意1:这不是解决问题的最有效方法。写到这里是为了让大家更容易理解

    注意2:如果可以的话,改变输入字典的格式。太复杂了

    注3:看来你的想法不是很清楚,这真的是你需要的吗?

    【讨论】:

    • 在您的方法中,您依赖于集合中元素的顺序,但集合是无序的。您应该在将col_name 分配给结果数据框的列之前对其进行排序 - 至少在原始列名也被排序的情况下,这有效。
    • 我认为数据是有序的。没有这个假设,只需改变sorted(col_name)sorted(index)这两个列表的顺序
    • 也许我们现在遇到了误解,换句话说:正确,我假设['mach1', 'mach2', 'mach3'] 也被订购。但是您对col_name 的实现可以是任何顺序,因为它是一个集合,被转换为一个列表,并且集合不保留顺序。例如,在我的例子中,我只是复制粘贴了你的函数,运行它,结果数据框的索引和值是正确的,但列名是 mach2 mach3 mach1,即错误。
    • 如果你这样做,你可以让 typecast 列出来,因为sorted 无论如何都会返回一个列表。
    • 谢谢,不幸的是,字典输入来自基于 pyomo 的优化算法,该算法适用于多索引字典,所以我想我必须处理它。无论如何,感谢您解决我问题的答案!附言是的,这正是我需要的,抱歉不清楚。我是stackoverflow的新手,没有扎实的编码背景+我是意大利人,我的英语不好,所以我正在努力做到最好:)再次感谢!
    【解决方案2】:

    我也没有让它与内置或漂亮的神奇短......

    但是 - 您可以“手动”完成:

    import pandas as pd
    
    # first with constants for your example to get the point:
    df = pd.DataFrame(columns=['mach1', 'mach2', 'mach3'], index=[1, 2, 3])
    
    # but of course better calculated for general case:
    df = pd.DataFrame(columns=sorted(set([t[0] for t in d.keys()])), index=sorted(set([t[1] for t in d.keys()])))
    
    #   mach1 mach2 mach3
    # 1   NaN   NaN   NaN
    # 2   NaN   NaN   NaN
    # 3   NaN   NaN   NaN
    
    for (k1, k2), v in d.items():
        df.loc[k2, k1] = v
    
    #    mach1  mach2  mach3
    # 1      4     10      3
    # 2      9      2      6
    # 3     16      4      1
    

    然后您可以为您的 Excel 编写 csv:

    df.to_csv('export.csv')
    
    # ,mach1,mach2,mach3
    # 1,4,10,3
    # 2,9,2,6
    # 3,16,4,1
    

    【讨论】:

    • 之所以有效,是因为它是 1,2,3 的一个简单示例
    • @DerekEden 不,我只是首先解决这个例子。一般的计算也在那里。
    • 不,算法从一开始就存在。除了元组的索引之外,索引与列的索引完全相同。
    猜你喜欢
    • 2014-12-09
    • 2021-08-28
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2020-05-09
    相关资源
    最近更新 更多