Python-从嵌套字典中的项目构造pandas DataFrame

发布于 2021-02-02 23:15:27

假设我有一个嵌套的字典'user_dict',其结构为:

  • 级别1: UserId(长整数)
  • 级别2:类别(字符串)
  • 级别3:各种属性(浮点数,整数等)。

例如,该词典的条目为:

user_dict[12] = {
    "Category 1": {"att_1": 1, 
                   "att_2": "whatever"},
    "Category 2": {"att_1": 23, 
                   "att_2": "another"}}

其中的每个项目都user_dict具有相同的结构,并且user_dict包含大量的项目,我希望将这些项目提供给pandas DataFrame,从而根据属性构造系列。在这种情况下,分层索引对于此目的将是有用的。

具体来说,我的问题是是否存在一种方法来帮助DataFrame构造函数理解应该从字典中“级别3”的值构建该系列的方法?

如果我尝试类似的方法:

df = pandas.DataFrame(users_summary)

“级别1”(用户ID)中的项目被视为列,这与我要实现的(将用户ID作为索引)相反。

我知道我可以在遍历字典条目之后构造该系列,但是如果有更直接的方法,这将非常有用。一个类似的问题是询问是否可以从文件中列出的json对象构造pandas DataFrame。

关注者
0
被浏览
106
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    大熊猫MultiIndex由元组列表组成。因此,最自然的方法是调整输入字典的形状,使其键为与所需的多索引值相对应的元组。然后,你可以使用pd.DataFrame.from_dict,使用选项来构建数据框orient='index'

    user_dict = {12: {'Category 1': {'att_1': 1, 'att_2': 'whatever'},
                      'Category 2': {'att_1': 23, 'att_2': 'another'}},
                 15: {'Category 1': {'att_1': 10, 'att_2': 'foo'},
                      'Category 2': {'att_1': 30, 'att_2': 'bar'}}}
    
    pd.DataFrame.from_dict({(i,j): user_dict[i][j] 
                               for i in user_dict.keys() 
                               for j in user_dict[i].keys()},
                           orient='index')
    
    
                   att_1     att_2
    12 Category 1      1  whatever
       Category 2     23   another
    15 Category 1     10       foo
       Category 2     30       bar
    

    一种替代方法是通过串联组件数据框来构建数据框:

    user_ids = []
    frames = []
    
    for user_id, d in user_dict.iteritems():
        user_ids.append(user_id)
        frames.append(pd.DataFrame.from_dict(d, orient='index'))
    
    pd.concat(frames, keys=user_ids)
    
                   att_1     att_2
    12 Category 1      1  whatever
       Category 2     23   another
    15 Category 1     10       foo
       Category 2     30       bar
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看