【问题标题】:Converting dict's repeating key:value pair into parents将dict的重复键:值对转换为父母
【发布时间】:2021-03-29 17:14:26
【问题描述】:

我有一个重复 ID 的假设列表:

list = [{'id': '1', 'name': 'John', 'status': 'active'},
        {'id': '1', 'name': 'Doe', 'status': 'active'},
        {'id': '2', 'name': 'Jane', 'status': 'inactive'},
        {'id': '2', 'name': 'Appleseed', 'status': 'active'}]

我想将此列表转换为嵌套列表/JSON,按 id 分组,键标签为“member_info”:

list_2 = [{'id': '1', 'member_info': [{'name': 'John', 'status': 'active'}
                                      {'name': 'Doe', 'status': 'active'}]},
          {'id': '2', 'member_info': [{'name': 'Jane', 'status': 'inactive'}
                                      {'name': 'Appleseed', 'status': 'active'}]}

我尝试过使用 pandas group by,但它遗漏了 id,没有任何嵌套。

df = pd.DataFrame(list)
df = df.groupby('id')['name','status'].agg()
list_2 = df.to_dict('records')

【问题讨论】:

    标签: python json pandas list dictionary


    【解决方案1】:

    试试:

    df.groupby('id')[['name','status']].apply(lambda x: x.to_dict(orient='row'))\
    .reset_index(name='member_info').to_dict(orient='row')
    

    [{'id': '1',
      'member_info': [{'name': 'John', 'status': 'active'},
       {'name': 'Doe', 'status': 'active'}]},
     {'id': '2',
      'member_info': [{'name': 'Jane', 'status': 'inactive'},
       {'name': 'Appleseed', 'status': 'active'}]}]
    

    第一次使用将数据转换成这种形式

    df.groupby('id')[['name','status']].apply(lambda x: x.to_dict(orient='row')).reset_index(name='member_info')


        id  member_info
    0   1   [{'name': 'John', 'status': 'active'}, {'name'...
    1   2   [{'name': 'Jane', 'status': 'inactive'}, {'nam...
    

    【讨论】:

    • 换行符,我的眼睛!考虑将你的一个衬垫包裹在括号中,这样你就可以组织像this 这样的函数。看起来更干净,并且更容易为每个步骤插入 cmets。祝你好运!
    • 谢谢你告诉我。我不知道那件事。这将使我更容易格式化代码。
    【解决方案2】:

    这可以通过列表理解等简单操作来完成。这是一个例子:

    dct = {}
    
    # This yields a dictionory of {id_1: list_of_members, id_1: list_of_members} structure
    for item in lst:
        if dct.get(item['id']): # existing id
            dct[item['id']].append({'name':item['name'], 'status':item['status']})
        else: # for new id
            dct[item['id']] = [{'name':item['name'], 'status':item['status']}] 
    
    # List comprehension over compiled dictionary items.
    ans = [{'id': k, 'member_info': v} for k,v in dct.items()]
    

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多