如何聚合一个键的不同值然后将另一个键的匹配值相加?
How to aggregate distinct values of one key then sum the matching values of the other key?
我制作了一个循环,以下列格式提供数据:
name_quant = [{'name_id': 'S00004', 'quantity': '1'}, {'name_id': 'S00004', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '1'},
{'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00002', 'quantity': '1'}]
我使用以下循环获取上面的值:
namesequence = EventSequence.objects.filter(description="names").values("Details")
name_quant = [{ 'name_id': e['element'][33:39],
'quantity': e['element'][50:51] } for e in namesequence ]
所以我的问题是如何汇总 name_ids 并对匹配 name_ids 的数量求和,以便得到如下结果:
name_sum = [{'name_id': 'S00001', 'quantity': '160'}, {'name_id': 'S00002', 'quantity': '50'}, {'name_id': 'S00003', 'quantity': '40'}, {'name_id': 'S00004', 'quantity': '90'}]
我会在 Django 中使用 sum 函数,但我必须首先对值进行下标和循环,这使得它有点复杂。
如果我没看错的话,好像要求是按数量合并键(name_id)。我看不出所需的输出值是如何从示例输入数据中导出的,但这可能是因为它不完整。
name_quant = [{'name_id': 'S00004', 'quantity': '1'}, {'name_id': 'S00004', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '1'},
{'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00002', 'quantity': '1'}]
td = dict()
for e in name_quant:
nid = e['name_id']
td[nid] = td.get(nid, 0) + int(e['quantity'])
new_list = [{'name_id': k, 'quantity': str(v)} for k, v in td.items()]
print(new_list)
输出:
[{'name_id': 'S00004', 'quantity': '3'}, {'name_id': 'S00003', 'quantity': '5'}, {'name_id': 'S00002', 'quantity': '1'}]
如果name_quant的列表很大,我更喜欢用pandas做groupby staff:
import pandas as pd
name_quant = [{'name_id': 'S00004', 'quantity': '1'}, {'name_id': 'S00004', 'quantity': '2'},
{'name_id': 'S00003', 'quantity': '1'},
{'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '2'},
{'name_id': 'S00002', 'quantity': '1'}]
df = pd.DataFrame.from_records(name_quant)
df['quantity'] = df['quantity'].astype(int)
results = df.groupby(['name_id']).agg({'quantity': 'sum'}).to_records() # [('S00002', 1) ('S00003', 5) ('S00004', 3)]
grouped_name_quant = [{'name_id': x[0], 'quantity': x[1]} for x in results]
print(grouped_name_quant)
输出为:
[{'name_id': 'S00002', 'quantity': 1}, {'name_id': 'S00003', 'quantity': 5}, {'name_id': 'S00004', 'quantity': 3}]
我制作了一个循环,以下列格式提供数据:
name_quant = [{'name_id': 'S00004', 'quantity': '1'}, {'name_id': 'S00004', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '1'},
{'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00002', 'quantity': '1'}]
我使用以下循环获取上面的值:
namesequence = EventSequence.objects.filter(description="names").values("Details")
name_quant = [{ 'name_id': e['element'][33:39],
'quantity': e['element'][50:51] } for e in namesequence ]
所以我的问题是如何汇总 name_ids 并对匹配 name_ids 的数量求和,以便得到如下结果:
name_sum = [{'name_id': 'S00001', 'quantity': '160'}, {'name_id': 'S00002', 'quantity': '50'}, {'name_id': 'S00003', 'quantity': '40'}, {'name_id': 'S00004', 'quantity': '90'}]
我会在 Django 中使用 sum 函数,但我必须首先对值进行下标和循环,这使得它有点复杂。
如果我没看错的话,好像要求是按数量合并键(name_id)。我看不出所需的输出值是如何从示例输入数据中导出的,但这可能是因为它不完整。
name_quant = [{'name_id': 'S00004', 'quantity': '1'}, {'name_id': 'S00004', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '1'},
{'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00002', 'quantity': '1'}]
td = dict()
for e in name_quant:
nid = e['name_id']
td[nid] = td.get(nid, 0) + int(e['quantity'])
new_list = [{'name_id': k, 'quantity': str(v)} for k, v in td.items()]
print(new_list)
输出:
[{'name_id': 'S00004', 'quantity': '3'}, {'name_id': 'S00003', 'quantity': '5'}, {'name_id': 'S00002', 'quantity': '1'}]
如果name_quant的列表很大,我更喜欢用pandas做groupby staff:
import pandas as pd
name_quant = [{'name_id': 'S00004', 'quantity': '1'}, {'name_id': 'S00004', 'quantity': '2'},
{'name_id': 'S00003', 'quantity': '1'},
{'name_id': 'S00003', 'quantity': '2'}, {'name_id': 'S00003', 'quantity': '2'},
{'name_id': 'S00002', 'quantity': '1'}]
df = pd.DataFrame.from_records(name_quant)
df['quantity'] = df['quantity'].astype(int)
results = df.groupby(['name_id']).agg({'quantity': 'sum'}).to_records() # [('S00002', 1) ('S00003', 5) ('S00004', 3)]
grouped_name_quant = [{'name_id': x[0], 'quantity': x[1]} for x in results]
print(grouped_name_quant)
输出为:
[{'name_id': 'S00002', 'quantity': 1}, {'name_id': 'S00003', 'quantity': 5}, {'name_id': 'S00004', 'quantity': 3}]