【问题标题】:Create a Tall formatted Dataframe from nested dictionaries [duplicate]从嵌套字典创建一个 Tall 格式的数据框 [重复]
【发布时间】: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)

标签: python pandas dataframe dictionary


【解决方案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 构造函数,然后使用stackingrenaming 并对axiscolumns 进行排序:

          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
          

          【讨论】:

            猜你喜欢
            • 2019-05-22
            • 1970-01-01
            • 2021-11-16
            • 2022-01-13
            • 1970-01-01
            • 2022-06-13
            • 1970-01-01
            相关资源
            最近更新 更多