如何使用Python按多个键对字典列表进行分组并计算各组的平均值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计650个文字,预计阅读时间需要3分钟。
通过多个键值对进行分组并计算字典列表的平均值,最Pythonic的方法是使用`collections.defaultdict`来分组,然后对每个分组计算平均值。以下是具体实现:
pythonfrom collections import defaultdict
input=[ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId2', 'qty': 150}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId3', 'qty': 200}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId4', 'qty': 250},]
使用defaultdict按dept分组grouped=defaultdict(list)for item in input: grouped[item['dept']].append(item['qty'])
计算每个分组的平均值averages={dept: sum(qties) / len(qties) for dept, qties in grouped.items()}
averages
输出结果将是一个字典,包含每个部门及其对应字典列表的平均值。
什么是通过多个键进行分组的最 pythonic方法,并在 Python中汇总字典列表的平均值?假设我有一个字典列表如下:input = [ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'bar', 'transId': 'uniqueId2', 'qty': 200}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId3', 'qty': 300}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId4', 'qty': 400}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId5', 'qty': 500}, {'dept': '002', 'sku': 'qux', 'transId': 'uniqueId6', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'transId': 'uniqueId7', 'qty': 700} ]
期望的聚合输出:
output=[ {'dept': '001', 'sku': 'foo', 'qty': 400}, {'dept': '001', 'sku': 'bar', 'qty': 200}, {'dept': '002', 'sku': 'baz', 'qty': 900}, {'dept': '002', 'sku': 'qux', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'qty': 700} ]
或平均:
output=[ {'dept': '001', 'sku': 'foo', 'avg': 200}, {'dept': '001', 'sku': 'bar', 'avg': 200}, {'dept': '002', 'sku': 'baz', 'avg': 450}, {'dept': '002', 'sku': 'qux', 'avg': 600}, {'dept': '003', 'sku': 'foo', 'avg': 700} ]
我发现了这个:Group by and aggregate the values of a list of dictionaries in Python但它似乎没有给我我想要的东西.
获得汇总结果from itertools import groupby from operator import itemgetter grouper = itemgetter("dept", "sku") result = [] for key, grp in groupby(sorted(input_data, key = grouper), grouper): temp_dict = dict(zip(["dept", "sku"], key)) temp_dict["qty"] = sum(item["qty"] for item in grp) result.append(temp_dict) from pprint import pprint pprint(result)
产量
[{'dept': '001', 'qty': 200, 'sku': 'bar'}, {'dept': '001', 'qty': 400, 'sku': 'foo'}, {'dept': '002', 'qty': 900, 'sku': 'baz'}, {'dept': '002', 'qty': 600, 'sku': 'qux'}, {'dept': '003', 'qty': 700, 'sku': 'foo'}]
要获得平均值,您可以简单地更改for循环内的内容,就像这样
temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["avg"] = sum(temp_list) / len(temp_list) result.append(temp_dict)
产量
[{'avg': 200, 'dept': '001', 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'sku': 'foo'}]
建议:无论如何,我会在这样的dict中添加qty和avg
temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["qty"] = sum(temp_list) temp_dict["avg"] = temp_dict["qty"] / len(temp_list) result.append(temp_dict)
产量
[{'avg': 200, 'dept': '001', 'qty': 200, 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'qty': 400, 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'qty': 900, 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'qty': 600, 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'qty': 700, 'sku': 'foo'}]
本文共计650个文字,预计阅读时间需要3分钟。
通过多个键值对进行分组并计算字典列表的平均值,最Pythonic的方法是使用`collections.defaultdict`来分组,然后对每个分组计算平均值。以下是具体实现:
pythonfrom collections import defaultdict
input=[ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId2', 'qty': 150}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId3', 'qty': 200}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId4', 'qty': 250},]
使用defaultdict按dept分组grouped=defaultdict(list)for item in input: grouped[item['dept']].append(item['qty'])
计算每个分组的平均值averages={dept: sum(qties) / len(qties) for dept, qties in grouped.items()}
averages
输出结果将是一个字典,包含每个部门及其对应字典列表的平均值。
什么是通过多个键进行分组的最 pythonic方法,并在 Python中汇总字典列表的平均值?假设我有一个字典列表如下:input = [ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'bar', 'transId': 'uniqueId2', 'qty': 200}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId3', 'qty': 300}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId4', 'qty': 400}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId5', 'qty': 500}, {'dept': '002', 'sku': 'qux', 'transId': 'uniqueId6', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'transId': 'uniqueId7', 'qty': 700} ]
期望的聚合输出:
output=[ {'dept': '001', 'sku': 'foo', 'qty': 400}, {'dept': '001', 'sku': 'bar', 'qty': 200}, {'dept': '002', 'sku': 'baz', 'qty': 900}, {'dept': '002', 'sku': 'qux', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'qty': 700} ]
或平均:
output=[ {'dept': '001', 'sku': 'foo', 'avg': 200}, {'dept': '001', 'sku': 'bar', 'avg': 200}, {'dept': '002', 'sku': 'baz', 'avg': 450}, {'dept': '002', 'sku': 'qux', 'avg': 600}, {'dept': '003', 'sku': 'foo', 'avg': 700} ]
我发现了这个:Group by and aggregate the values of a list of dictionaries in Python但它似乎没有给我我想要的东西.
获得汇总结果from itertools import groupby from operator import itemgetter grouper = itemgetter("dept", "sku") result = [] for key, grp in groupby(sorted(input_data, key = grouper), grouper): temp_dict = dict(zip(["dept", "sku"], key)) temp_dict["qty"] = sum(item["qty"] for item in grp) result.append(temp_dict) from pprint import pprint pprint(result)
产量
[{'dept': '001', 'qty': 200, 'sku': 'bar'}, {'dept': '001', 'qty': 400, 'sku': 'foo'}, {'dept': '002', 'qty': 900, 'sku': 'baz'}, {'dept': '002', 'qty': 600, 'sku': 'qux'}, {'dept': '003', 'qty': 700, 'sku': 'foo'}]
要获得平均值,您可以简单地更改for循环内的内容,就像这样
temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["avg"] = sum(temp_list) / len(temp_list) result.append(temp_dict)
产量
[{'avg': 200, 'dept': '001', 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'sku': 'foo'}]
建议:无论如何,我会在这样的dict中添加qty和avg
temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["qty"] = sum(temp_list) temp_dict["avg"] = temp_dict["qty"] / len(temp_list) result.append(temp_dict)
产量
[{'avg': 200, 'dept': '001', 'qty': 200, 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'qty': 400, 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'qty': 900, 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'qty': 600, 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'qty': 700, 'sku': 'foo'}]

