如何在python和小计中对字典值进行分组

时间:2019-07-06 00:47:43

标签: python django pandas numpy dictionary

我有以下字典

#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_jam”。

  2. 如何获取字典列表中每个字典值“ 16-17”,“ 17-18”,“ 18-19”的键“输出”之和,然后插入到“ output_ot”。

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

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

请问您对此有何建议?

1 个答案:

答案 0 :(得分: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键是'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,而grouper本身就是一个迭代器,该迭代器使用该值对所有字典进行迭代。最后,使用map(lambda...提取那些在字典中为键output存储的所有值并将其求和。

但是,正如已经有人说过的那样,您也可以在熊猫中这样做。有了熊猫,事情变得容易得多。但这一切都取决于您是否可以更改数据结构,还是以某种方式固定它。