Как сгруппировать значения словаря в Python и промежуточный итог - PullRequest
0 голосов
/ 06 июля 2019

У меня есть следующий словарь

#BEFORE
data={
'cell_1':['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['10'], 'output_jam_1': [''], 'time_1': [''], 'output_ot_1': [''], 'time_ot_1': [''],
'cell_2':['13a'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['20'], 'output_jam_2': [''], 'time_2': [''], 'output_ot_2': [''], 'time_ot_2': [''], 
'cell_3':['13c'], 'jam_3': ['07-08'], 'model_3': ['SUPERSTAR'], 'output_3': ['40'], 'output_jam_3': [''], 'time_3': [''], 'output_ot_3': [''], 'time_ot_3': [''], 
'cell_4':['13b'], 'jam_4': ['08-09'], 'model_4': ['SUPERSTAR'], 'output_4': ['30'], 'output_jam_4': [''], 'time_4': [''], 'output_ot_4': [''], 'time_ot_4': [''],
'cell_5':['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': [''], 'time_ot_5': [''],
'cell_6':['13d'], 'jam_6': ['16-17'], 'model_6': ['SUPERSTAR'], 'output_6': ['40'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': [''], 'time_ot_6': [''],
'cell_7':['13d'], 'jam_7': ['17-18'], 'model_7': ['SUPERSTAR'], 'output_7': ['10'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': [''], 'time_ot_7': [''],
'cell_8':['13d'], 'jam_8': ['18-19'], 'model_8': ['SUPERSTAR'], 'output_8': ['60'], 'output_jam_8': [''], 'time_8': [''], 'output_ot_8': [''], 'time_ot_8': [''],
}
I WANT
#AFTER
data={
'cell_1':['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['10'], 'output_jam_1': ['30'], 'time_1': ['0.33'], 'output_ot_1': [''], 'time_ot_1':[''],
'cell_2':['13a'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['20'], 'output_jam_2': ['30'], 'time_2': ['0.67'], 'output_ot_2': [''], 'time_ot_2':[''],
'cell_3':['13c'], 'jam_3': ['07-08'], 'model_3': ['SUPERSTAR'], 'output_3': ['40'], 'output_jam_3': ['40'], 'time_3': ['1'], 'output_ot_3': [''], 'time_ot_3':[''],
'cell_4':['13b'], 'jam_4': ['08-09'], 'model_4': ['SUPERSTAR'], 'output_4': ['30'], 'output_jam_4': ['30'], 'time_4': ['1'], 'output_ot_4': [''], 'time_ot_4':[''],
'cell_5':['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': ['80'], 'time_ot_5':['0.5'],
'cell_6':['13d'], 'jam_6': ['16-17'], 'model_6': ['SUPERSTAR'], 'output_6': ['40'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': ['80'], 'time_ot_6':['0.5'],
'cell_7':['13d'], 'jam_7': ['17-18'], 'model_7': ['SUPERSTAR'], 'output_7': ['10'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': ['10'], 'time_ot_7':['1'],
'cell_8':['13d'], 'jam_8': ['18-19'], 'model_8': ['SUPERSTAR'], 'output_8': ['60'], 'output_jam_8': [''], 'time_8': [''], 'output_ot_8': ['60'], 'time_ot_8':['1'],
}
  1. Как получить сумму ключа 'output' для каждого значения словаря '07 -08 ''08 -09' и значений 13a, 13b, 13c, 13d в списке словарей и затем я хочу вставить это в 'output_jam'.

  2. Как получить сумму ключа 'output' для каждого значения словаря '16 -17 ', '17 -18', '18 -19 'в списке словарей и затем я хочу вставить что до «output_ot».

  3. Как рассчитать «время» по формуле (время = выход / затор на выходе).

  4. Как получить вычисление time_ot по формуле (time_ot = output / output_ot)

Не могли бы вы высказать свои пожелания по этому вопросу?

1 Ответ

0 голосов
/ 06 июля 2019

Под другой структурой данных мы подразумевали, что если вы, например, сохраняете свои данные в списке, как показано ниже, гораздо проще выполнять запрошенные вами операции. Обратите внимание, что я удалил списки вокруг значений и использую int для представления значения output.

data=[
{'cell': '13a', 'jam': '07-08', 'model': 'SUPERSTAR', 'output': 10, 'output_jam': '30', 'time': '0.33', 'output_ot': '', 'time_ot': ''},
{'cell': '13a', 'jam': '07-08', 'model': 'SUPERSTAR', 'output': 20, 'output_jam': '30', 'time': '0.67', 'output_ot': '', 'time_ot': ''},
{'cell': '13c', 'jam': '07-08', 'model': 'SUPERSTAR', 'output': 40, 'output_jam': '40', 'time': '1', 'output_ot': '', 'time_ot': ''},
{'cell': '13b', 'jam': '08-09', 'model': 'SUPERSTAR', 'output': 30, 'output_jam': '30', 'time': '1', 'output_ot': '', 'time_ot': ''},
{'cell': '13d', 'jam': '16-17', 'model': 'SUPERSTAR', 'output': 40, 'output_jam': '', 'time': '', 'output_ot': '80', 'time_ot': '0.5'},
{'cell': '13d', 'jam': '16-17', 'model': 'SUPERSTAR', 'output': 40, 'output_jam': '', 'time': '', 'output_ot': '80', 'time_ot': '0.5'},
{'cell': '13d', 'jam': '17-18', 'model': 'SUPERSTAR', 'output': 10, 'output_jam': '', 'time': '', 'output_ot': '10', 'time_ot': '1'},
{'cell': '13d', 'jam': '18-19', 'model': 'SUPERSTAR', 'output': 60, 'output_jam': '', 'time': '', 'output_ot': '60', 'time_ot': '1'}]

В этой структуре вы можете упростить реализацию операций фильтрации и группировки. Например. отфильтровать все словари, для которых ключ jam является одним из '07-08', '08-09', просто можно сделать так:

filtered= [doc for doc in data if doc['jam'] in ['07-08', '08-09']]

Действительно просто, не правда ли?

Для группировки (суммы для словарей с одинаковым значением jam) вы можете использовать itertools.groupby:

from itertools import groupby

def sort_and_groupby(data, key):
    data.sort(key=key)
    return groupby(data, key=key)

for key, grouper in sort_and_groupby(data, lambda doc: doc['jam']):
    print(key, sum(map(lambda doc: doc['output'], grouper)))

Вам просто нужно убедиться, что данные предварительно отсортированы, если вы используете itertools.groupby, иначе данные не будут правильно агрегированы. Вот почему я определил sort_and_groupby. Он просто возвращает объект groupby. Объект groupby позволяет перебирать все различные значения для jam, и для каждого из них он возвращает группировщик, который сам является итератором, который перебирает все словари с этим значением. Наконец, с помощью map(lambda... я извлекаю все значения, сохраненные для ключа output в этом словаре, и суммирую его.

Но, как уже сказал кто-то другой, вы также можете сделать это в пандах. С пандами такие вещи становятся намного проще. Но это все зависит от того, можете ли вы изменить структуру данных или как-то это исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...