我是一名Python新手,我正在努力重组嵌套字典中包含的数据。原始数据是这样的:
['period_1': {'metric_1':{'person_1': 0, 'person_2': 1},
{'metric_2': {'person_1': 2, 'person_2': 3}}, 'period_2' :{ ...}
我想要获得的是面板数据,以人为主键,后跟句点,后跟指标。像这样:
{'person_1': {'period_1': {'metric_1': 0, 'metric_2': 2}, 'period_2':
{'metric_1': 4, 'metric_2': 6}, 'period_2'{ ... }}, 'person_2': { ...}
到目前为止我尝试了什么(字典allUsers
将成为我存储重组数据的地方。它已经有人的ID作为键,空的dicts作为值):
allUsers = {'pippo':{}, 'pluto':{}}
for t in range (len (periods)):
for user in allUsers:
allUsers[user][t] = {}
period = periods[t]
for metric in period:
for person in period[metric]:
allUsers[person][t] = {metric: period[metric][person]}
出于某种原因,这不起作用。它只存储两个指标中的一个。
>>> allUsers
{'pippo': {0: {'metric1': 1}, 1: {'metric1': 1}},
'pluto': {0: {'metric1': 2}, 1: {'metric1': 1}}}
提前感谢您的帮助。
答案 0 :(得分:1)
问题是,对于您找到的每个新时段/指标,您正在创建新词典并在该行中添加allUsers[person][t]
-
allUsers[person][t] = {metric: period[metric][person]}
因此只有一次。如果t
中已存在allUsers
,您实际上想要添加新的键/值。示例 -
for metric in period:
for person in period[metric]:
allUsers[person][t][metric] = period[metric][person]
但假设periods
是字典,您可以使用dict.setdefault
来简化此操作。示例 -
result = {}
for period, value in periods.items():
for metric, v in value.items():
for person,val in v.items():
result.setdefault(person,{}).setdefault(period,{}).set(metric,val)
答案 1 :(得分:0)
您需要对句点,指标和人员进行迭代,因此复合键[person] [period]对于每个迭代步骤都不会是唯一的。当您分配给该密钥时,您将覆盖之前的任何内容,即先前的度量字典。