Próbuję napisać funkcję w elegancki sposób, który zgrupuje listę słowników i zagreguje (sumuje) wartości podobnych kluczy.Grupuj według i agreguj wartości listy słowników w Pythonie
Przykład:
my_dataset = [
{
'date': datetime.date(2013, 1, 1),
'id': 99,
'value1': 10,
'value2': 10
},
{
'date': datetime.date(2013, 1, 1),
'id': 98,
'value1': 10,
'value2': 10
},
{
'date': datetime.date(2013, 1, 2),
'id' 99,
'value1': 10,
'value2': 10
}
]
group_and_sum_dataset(my_dataset, 'date', ['value1', 'value2'])
"""
Should return:
[
{
'date': datetime.date(2013, 1, 1),
'value1': 20,
'value2': 20
},
{
'date': datetime.date(2013, 1, 2),
'value1': 10,
'value2': 10
}
]
"""
Próbowałem robić to za pomocą itertools dla GroupBy i zsumowanie każdą parę jak klucz wartość, ale jestem brakuje czegoś tutaj. Oto co moja funkcja obecnie wygląda następująco:
def group_and_sum_dataset(dataset, group_by_key, sum_value_keys):
keyfunc = operator.itemgetter(group_by_key)
dataset.sort(key=keyfunc)
new_dataset = []
for key, index in itertools.groupby(dataset, keyfunc):
d = {group_by_key: key}
d.update({k:sum([item[k] for item in index]) for k in sum_value_keys})
new_dataset.append(d)
return new_dataset
To jest świetne! Czy masz jakieś przemyślenia na temat grupowania według 2 pól? Jak na przykład w tym przykładzie chciałbyś pogrupować według id i date? Obecnie moim pomysłem jest połączenie dwóch pól w jeden, ale nie wydaje się to zbyt eleganckie. – aiguofer