【问题标题】:How to convert data frame with dictionary columns into multi level data frame如何将带有字典列的数据框转换为多级数据框
【发布时间】:2019-08-26 09:42:35
【问题描述】:

我有 DataFrame,其中包含列中的字典。

可以如下创建

 lis = [
     {'id': '1', 
     'author': {'self': 'A', 
     'displayName': 'A'}, 
     'created': '2018-12-18', 
     'items': {'field': 'status', 
         'fromString': 'Backlog'}}, 
     {'id': '2', 
     'author': {'self': 'B', 
     'displayName': 'B'}, 
     'created': '2018-12-18', 
     'items': {'field': 'status', 
         'fromString': 'Funnel'}}] 

pd.DataFrame(lis)  

                              author     created id                                           items
0  {'self': 'A', 'displayName': 'A'}  2018-12-18  1  {'field': 'status', 'fromString': 'Backlog'}
1  {'self': 'B', 'displayName': 'B'}  2018-12-18  2   {'field': 'status', 'fromString': 'Funnel'}

我想将此信息转换为多级 DataFrame。

我一直在尝试

pd.MultiIndex.from_product(lis) 
pd.MultiIndex.from_frame(pd.DataFrame(lis))

但无法得到我正在寻找的结果。基本上我想要如下:

        author               created        id       items

self       displayName                             field   fromString
 A             A            2018-12-18       1      status   Backlog
 B             B            2018-12-18       2      status   Funnel

关于我如何实现这一点的任何建议?

谢谢

【问题讨论】:

    标签: python pandas multi-level


    【解决方案1】:

    您可以使用json.json_normalize - 但列名称会使用. 分隔符展开:

    from pandas.io.json import json_normalize
    
    lis = [
         {'id': '1', 
         'author': {'self': 'A', 
         'displayName': 'A'}, 
         'created': '2018-12-18', 
         'items': {'field': 'status', 
             'fromString': 'Backlog'}}, 
         {'id': '2', 
         'author': {'self': 'B', 
         'displayName': 'B'}, 
         'created': '2018-12-18', 
         'items': {'field': 'status', 
             'fromString': 'Funnel'}}] 
    
    df = json_normalize(lis)
    print (df)
      id     created author.self author.displayName items.field items.fromString
    0  1  2018-12-18           A                  A      status          Backlog
    1  2  2018-12-18           B                  B      status           Funnel
    

    对于列和索引中的MulitIndex - 首先由所有没有. 的列通过DataFrame.set_index 创建Mulitiindex,然后使用str.split

    df = df.set_index(['id','created'])
    df.columns = df.columns.str.split('.', expand=True)
    print (df)
                  author               items           
                    self displayName   field fromString
    id created                                         
    1  2018-12-18      A           A  status    Backlog
    2  2018-12-18      B           B  status     Funnel
    

    如果在列中需要MulitIndex - 可以,但在列名称中会出现缺失值:

    df.columns = df.columns.str.split('.', expand=True)
    print (df)
       id     created author               items           
      NaN         NaN   self displayName   field fromString
    0   1  2018-12-18      A           A  status    Backlog
    1   2  2018-12-18      B           B  status     Funnel
    

    缺失值应替换为空字符串:

    df = df.rename(columns= lambda x: '' if x != x else x)
    print (df)
      id     created author               items           
                       self displayName   field fromString
    0  1  2018-12-18      A           A  status    Backlog
    1  2  2018-12-18      B           B  status     Funnel
    

    【讨论】:

    • 感谢@jezrael,了解分步信息
    【解决方案2】:

    试试下面的,希望这会有所帮助。

    df = pd.io.json.json_normalize(lis)
    print(sorted(df.columns))
    
    tupleList = [tuple(values.split(".")) if "." in values else (values,None) for values in sorted(df.columns)]
    
    df.columns=pd.MultiIndex.from_tuples(tuplelist)
    print(df)
    

    输出如下所示

    author              created     id   items
    displayName self    NaN         NaN  field  fromString
        A       A        2018-12-18  1   status  Backlog
        B       B        2018-12-18  2   status  Funnel
    

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2021-01-08
      • 1970-01-01
      • 2018-08-14
      • 2019-05-26
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多