将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的重复键:值对转换为父母的主要内容,如果未能解决你的问题,请参考以下文章