代码之家  ›  专栏  ›  技术社区  ›  lazy_frog

如何将嵌套字典列表转换为熊猫数据帧?

  •  1
  • lazy_frog  · 技术社区  · 6 年前

    我有一些包含嵌套字典的数据,如下所示:

    mylist = [{"a": 1, "b": {"c": 2, "d":3}}, {"a": 3, "b": {"c": 4, "d":3}}]
    

    如果我们把它转换成熊猫数据帧,

    import pandas as pd 
    
    result_dataframe = pd.DataFrame(mylist)
    print(result_dataframe)
    

    它将输出:

        a   b
      0 1   {'c': 2, 'd': 3}
      1 3   {'c': 4, 'd': 3}
    

    我想转换字典列表并忽略嵌套字典的键。我的代码如下:

    new_dataframe = result_dataframe.drop(columns=["b"])
    b_dict_list = [document["b"] for document in mylist]
    b_df = pd.DataFrame(b_dict_list)
    frames = [new_dataframe, b_df]
    total_frame = pd.concat(frames, axis=1)
    

    总帧是我想要的:

        a   c   d
    0   1   2   3
    1   3   4   3
    

    但我觉得我的代码有点复杂。有什么简单的方法来解决这个问题吗?谢谢您。

    3 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    使用 dict comprehension 具有 pop 提取值 b merge dictionaries :

    a = [{**x, **x.pop('b')} for x in mylist]
    print (a)
    [{'a': 1, 'c': 2, 'd': 3}, {'a': 3, 'c': 4, 'd': 3}]
    
    result_dataframe = pd.DataFrame(a)
    print(result_dataframe)
       a  c  d
    0  1  2  3
    1  3  4  3
    

    另一个解决方案,谢谢@sandeep kadapa:

    a = [{'a': x['a'], **x['b']} for x in mylist] 
    #alternative
    a = [{'a': x['a'], **x.get('b')} for x in mylist] 
    
        2
  •  1
  •   anky    6 年前

    或通过应用 pd.Series() 你的方法是:

    mylist = [{"a": 1, "b": {"c": 2, "d":3}}, {"a": 3, "b": {"c": 4, "d":3}}]
    result_dataframe = pd.DataFrame(mylist)
    result_dataframe.drop('b',1).join(result_dataframe.b.apply(pd.Series))
    
       a  c  d
    0  1  2  3
    1  3  4  3
    
        3
  •  1
  •   ycx    6 年前

    我更喜欢编写一个函数来接受 mylist 并将其1嵌套层向下转换并返回字典。这有一个额外的优点,即不需要您“手动”知道什么样的键 b 皈依。所以这个函数适用于所有嵌套键1层。

    mylist = [{"a": 1, "b": {"c": 2, "d":3}}, {"a": 3, "b": {"c": 4, "d":3}}]
    import pandas as pd
    
    def dropnested(alist):
        outputdict = {}
        for dic in alist:
            for key, value in dic.items():
                if isinstance(value, dict):
                    for k2, v2, in value.items():
                        outputdict[k2] = outputdict.get(k2, []) + [v2]
                else:
                    outputdict[key] = outputdict.get(key, []) + [value]
        return outputdict    
    
    df = pd.DataFrame.from_dict(dropnested(mylist))
    print (df)
    #   a  c  d
    #0  1  2  3
    #1  3  4  3
    

    如果你尝试:

    mylist = [{"a": 1, "b": {"c": 2, "d":3}, "g": {"e": 2, "f":3}}, 
              {"a": 3, "z": {"c": 4, "d":3}, "e": {"e": 2, "f":3}}]
    df = pd.DataFrame.from_dict(dropnested(mylist))
    print (df)
    #   a  c  d  e  f
    #0  1  2  3  2  3
    #1  3  4  3  2  3
    

    我们在这里可以看到它转换钥匙 , g , z , e 没有问题,而不是必须定义要转换的每个嵌套键名