-1

我有以下字典

#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. 如何获得每个字典值 '07-08' '08-09' 和字典列表中的值 13a、13b、13c、13d 的键 'output' 的总和,然后我想将其插入到 'output_jam '。

  2. 如何获得字典列表中每个字典值“16-17”、“17-18”、“18-19”的键“输出”的总和,然后我想将其插入到“output_ot”。

  3. 如何使用公式(时间 = 输出 / 输出堵塞)计算“时间”。

  4. 如何使用公式(time_ot = output /output_ot)获得计算“time_ot”

请问您对此有什么建议吗??

4

1 回答 1

0

我们使用另一种数据结构的意思是,例如,如果您将数据存储在如下列表中,则执行您要求的操作会容易得多。请注意,我删除了值周围的列表并使用 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例如,过滤所有键为 just 之一的字典'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 的所有不同值进行迭代,并为它们中的每一个返回一个 grouper,它本身就是一个迭代器,它使用该值迭代所有字典。最后,map(lambda...我提取了为output这些字典中的键存储的所有值并将其汇总。

但正如其他人已经说过的那样,你也可以在 pandas 中做到这一点。有了 pandas,这样的事情就变得容易多了。但这一切都取决于您是否可以更改数据结构,或者是否以某种方式对其进行了修复。

于 2019-07-06T09:44:31.347 回答