从嵌套字典创建一个 Tall 格式的数据框 [重复]

Posted

技术标签:

【中文标题】从嵌套字典创建一个 Tall 格式的数据框 [重复]【英文标题】:Create a Tall formatted Dataframe from nested dictionaries [duplicate] 【发布时间】:2019-08-04 17:15:30 【问题描述】:

您好,我有一本字典,如图所示(复制示例)。我想把它转换成一个高大的DataFrame

字典示例:

'Jill': 'Avenger: Age of Ultron': 7.0,
         'Django Unchained': 6.5,
         'Gone Girl': 9.0,
         'Kill the Messenger': 8.0,
 'Toby': 'Avenger: Age of Ultron': 8.5,
          'Django Unchained': 9.0,
          'Zoolander': 2.0

预期的高数据框如下所示:

   Column1        Column2              Column3
    Jill     Avenger: Age of Ultron      7.0
    Jill     Django Unchained            6.5
    Jill     Gone Girl                   9.0
    Jill     Kill the Messenger          8.0
    Toby     Avenger: Age of Ultron      8.5
    Toby     Django Unchained            9.0
    Toby     Zoolander                   2.0

我尝试了以下方法,它将字典的主键作为第一列,但无法使其成为高数据框:

pd.DataFrame.from_dict(d, orient='index')

【问题讨论】:

你可以使用一个简单的字典理解来解析这个从 concat 语句开始 pd.concat(k: pd.DataFrame(v).T for k, v in yourDict.items(), axis=0) 【参考方案1】:
d = 'Jill': 'Avenger: Age of Ultron': 7.0,
                            'Django Unchained': 6.5,
                            'Gone Girl': 9.0,
                            'Kill the Messenger': 8.0,
'Toby': 'Avenger: Age of Ultron': 8.5,
                                'Django Unchained': 9.0,
                                'Zoolander': 2.0

df = pd.DataFrame.from_dict(d).reset_index()
df = pd.melt(df, id_vars=["index"], 
                  var_name="By", value_name="Score").dropna()

【讨论】:

【参考方案2】:

一种相当简单的方法是将字典转换为列表列表并将其提供给数据框:

data = [[x, y, z] for x,v in d.items() for y, z in v.items()]
df = pd.DataFrame(data, columns=['Column' + str(i) for i in range(1,4)])

它给出:

  Column1                 Column2  Column3
0    Jill  Avenger: Age of Ultron      7.0
1    Jill        Django Unchained      6.5
2    Jill               Gone Girl      9.0
3    Jill      Kill the Messenger      8.0
4    Toby  Avenger: Age of Ultron      8.5
5    Toby        Django Unchained      9.0
6    Toby               Zoolander      2.0

【讨论】:

【参考方案3】:
ratings = 'Jill': 'Avenger: Age of Ultron': 7.0,
                    'Django Unchained': 6.5,
                    'Gone Girl': 9.0,
                    'Kill the Messenger': 8.0,
           'Toby': 'Avenger: Age of Ultron': 8.5,
                    'Django Unchained': 9.0,
                    'Zoolander': 2.0
values = [[name, movie, rating] for name, r in ratings.items() for movie, rating in r.items()] 
df = pd.dataframe(values)

【讨论】:

【参考方案4】:

只需传递给DataFrame ,其余的我们在pandas 中处理

pd.DataFrame(ratings).reset_index().melt('index').dropna()
Out[118]: 
                    index variable  value
0  Avenger: Age of Ultron     Jill    7.0
1        Django Unchained     Jill    6.5
2               Gone Girl     Jill    9.0
3      Kill the Messenger     Jill    8.0
5  Avenger: Age of Ultron     Toby    8.5
6        Django Unchained     Toby    9.0
9               Zoolander     Toby    2.0

【讨论】:

【参考方案5】:

另一种方法,按原样在dict 上使用pandas.DataFrame 构造函数,然后使用stacking、renaming 并对axis 和columns 进行排序:

df = (pd.DataFrame(d)
      .stack()
      .reset_index()
      .rename('level_0': 'Column2', 'level_1': 'Column1', 0: 'Column3', axis=1)
      .sort_index(1).sort_values('Column1'))

print(df)


  Column1                 Column2  Column3
0    Jill  Avenger: Age of Ultron      7.0
2    Jill        Django Unchained      6.5
4    Jill               Gone Girl      9.0
5    Jill      Kill the Messenger      8.0
1    Toby  Avenger: Age of Ultron      8.5
3    Toby        Django Unchained      9.0
6    Toby               Zoolander      2.0

【讨论】:

以上是关于从嵌套字典创建一个 Tall 格式的数据框 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框创建嵌套字典

如何使用熊猫从嵌套字典创建数据框?

如何从嵌套字典创建多索引数据框?

从熊猫数据框中提取嵌套字典

Python嵌套字典到数据框[重复]

从字典创建数据框[重复]