【问题标题】:How to Group dictionary values in python and subtotal如何在python和小计中对字典值进行分组
【发布时间】:2019-11-16 12:34:42
【问题描述】:

我有以下字典

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

您能对此提出建议吗?

【问题讨论】:

  • 我建议将数据重组为更健全的数据。如果您熟悉 pandas,可以尝试将其强制转换为数据框
  • 您的问题措辞令人困惑。 2号,你不是说output_jam吗?你应该改写第 1 条,它只与堵塞值有关,与单元格值无关正确吗?
  • 您应该将其转换为带有字典的列表,然后您可以使用没有数字的变量 - [{"cell": ... }, {"cell": ... }, ...] - 然后更容易进行计算。
  • 以你现有的数据结构,很难做你想做的操作。所以毫不奇怪,你很难做到这一点。我也不确定,如果您可以依赖保存的键的顺序,因为我认为通常的字典在 Python 中不能保证这一点(有一种叫做 OrderedDictionary 的东西)。

标签: python django pandas numpy dictionary


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多