从嵌套字典创建高格式的数据帧

2024-10-06 04:22:36 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一本字典,如图所示(复制的例子)。我想把它转换成一个高的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')

Tags: ofthedjangodataframeage字典messengerunchained
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)

一个相当简单的方法是将dictionary转换为列表列表,并向dataframe提供:

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
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()

相关问题 更多 >