如何使用一个键作为行索引,另一个键作为列索引将双索引字典转换为 excel 文件?



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

我尝试查找熊猫文档和/或其他不同的解决方案,但没有一个正常工作。

字典是这样的:

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

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

Ciao Andrea,
从你提供的字典开始作为示例:

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

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

  2. 格式化熊猫的数据:

    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. 和熊猫做点什么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:看来你的想法不是很清楚,这真的是你需要的吗?

我也没有让它与内置的 sth 一起工作或漂亮的神奇短...

但是 - 您可以"手动"执行此操作:

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

最新更新