【问题标题】:Create dataframe from nested dictionaries which contain lists从包含列表的嵌套字典创建数据框
【发布时间】:2020-05-10 07:42:33
【问题描述】:

我找不到与我的问题类似的答案,所以我们开始吧:

我有以下形式的字典:

d = {key_1: 
        {
         metric_1: [value_11, value_12], 
         metric_2: [value_13, value_14], 
         metric_3: value_15
       }, 
      key_2: {
         metric_1: [value_21], 
         metric_2: [value_22], 
         metric_3: value_23
       }
    }

如您所见,指标在其列表中包含的项目数量不同。

将其转换为 df 的好方法是什么?如果我使用 from_dict 方法,我最终会得到包含列表的 df 单元格(坏)。

我想要实现的是为列表中的每个值创建一个新行,并将键作为索引:

index | metric_1 | metric_2 | metric_3
———————————————————————————————————————
key_1 | value_11 | value_13 | value_15
key_1 | value_12 | value_14 | value_15
key_2 | value_21 | value_22 | value_23

想法? :)

【问题讨论】:

    标签: python pandas dataframe dictionary nested


    【解决方案1】:

    这是一种方法

    s=pd.DataFrame(d).T
    s=s.explode('metric_1').assign(metric_2=s.metric_2.explode().values)
           metric_1  metric_2  metric_3
    key_1  value_11  value_13  value_15
    key_1  value_12  value_14  value_15
    key_2  value_21  value_22  value_23
    #s.reset_index(inplace=True)
    

    【讨论】:

    • 谢谢!这也有效,但我希望 df 的大小会改变,所以我最终使用了下面的@Datanovice 建议。
    【解决方案2】:

    如果您的数据框具有任意长度的键和值,这是一种方法

    data_dict = {k : pd.DataFrame(v) for k,v in d.items()}
    
    df = pd.concat(data_dict .values(),keys=data_dict.keys())
    

    print(df)
    
    
             metric_1  metric_2  metric_3
    key_1 0  value_11  value_13  value_15
          1  value_12  value_14  value_15
    key_2 0  value_21  value_22  value_23
    

    【讨论】:

    • 这是我最终使用的,因为我希望有任意长度的键和值。谢谢!
    • @gplt 不客气,编码愉快(别忘了给 YO 和 BEN_W 的解决方案点赞,那个人是天才 :))
    猜你喜欢
    • 2021-12-08
    • 2023-03-23
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2021-11-16
    • 2022-01-13
    相关资源
    最近更新 更多