将dict的重复键:值对转换为父母

Posted

技术标签:

【中文标题】将dict的重复键:值对转换为父母【英文标题】:Converting dict's repeating key:value pair into parents 【发布时间】: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')

【问题讨论】:

【参考方案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()]

【讨论】:

以上是关于将dict的重复键:值对转换为父母的主要内容,如果未能解决你的问题,请参考以下文章

dict update 更新嵌套键值对[重复]

将 DataFrame 转换为 dict [重复]

如何将当前用户的属性转换为dict格式[重复]

将Dataframe转换为dict列表太慢[重复]

将数据框转换为字典 [重复]

将dict列表转换为pandas中的行[重复]