首页 > 解决方案 > 有没有一种方法可以从这个特定的字典中创建一个多索引数据帧来保持数据的完整性?

问题描述

我有以下字典,我想将其转换为多索引(在列上)DataFrame:

fdict = {}
fdict['apple'] = {}
fdict['banana'] = {}

fdict['apple']['green'] = 5
fdict['apple']['red'] = 3
fdict['banana']['light_yellow'] = 10
fdict['appraisal round'] = 1

fdict

{'apple': {'green': 5, 'red': 3},
 'banana': {'light_yellow': 10},
 'appraisal round': 1}

我已设法将其转换为我想要的多索引(在列上)DataFrame,如下所示:

import numpy as np
import pandas as pd    

fruit_array = []
quality_array = []
values_array = []
for key in [key for key in fdict.keys() if key != 'appraisal round']:

    keys = fdict[key].keys()
    fr_array = np.repeat(key,len(keys))
    fruit_array.extend(fr_array)
    quality_array.extend(keys)
    val_array = fdict[key].values()
    values_array.extend(val_array)

columns_index = pd.MultiIndex.from_arrays([fruit_array,quality_array])
df = pd.DataFrame(data=np.reshape(values_array,(1,len(values_array))),columns=columns_index,index=[fdict['appraisal round']])

df

    apple       banana
    green   red light_yellow
1   5       3   10

我对这种方法有一个特别的担忧,即(据我了解)字典不是专门排序的(除非您使用和排序的字典,我不想在这里使用)并且我将循环中的数据提取到数组中其中对于生成的 DataFrame 的构建很重要。我需要一种方法来保持数据链接的完整性,而不依赖于数据将以正确的顺序提取的事实。

那么,是否有一种首选方法可以显式维护字典中的键、值对关系,同时从中创建 DataFrame?此外,更少的代码行会很棒。

谢谢!

标签: python-3.xpandasdataframedictionarymulti-index

解决方案


dicts 在 python 3.6+ 中维护插入顺序。但与其担心这一点,不如取消嵌套字典,使其更适合 MultiIndex。MultiIndex 只是具有键的元组,因此我们可以创建它。

md = {(k1, k2) : v for k1,d in fdict.items() if k1 != 'appraisal round'
                   for k2,v in d.items()}

pd.DataFrame(md, index=[fdict['appraisal round']])
#  apple           banana
#  green red light_yellow
#1     5   3           10

推荐阅读