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

2024-04-23 12:03:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下列词典

#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\u jam”。

  2. 如何获取字典列表中每个字典值“16-17”、“17-18”、“18-19”的键“output”的和,然后将其插入到“output\ot”中。

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

  4. 如何使用公式(time\u ot=output/output\u ot)计算“time\u ot”

你能给我一些建议吗??你知道吗


Tags: 列表outputdatamodel字典time时间cell
1条回答
网友
1楼 · 发布于 2024-04-23 12:03:57

我们使用另一种数据结构的意思是,例如,如果您将数据存储在下面这样的列表中,那么执行您要求的操作就容易得多。请注意,我删除了值周围的列表,并使用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存储的所有值,并对其进行汇总。你知道吗

但正如其他人所说,你也可以在熊猫身上做到这一点。有了熊猫,这样的事情就容易多了。但这一切都取决于您是否可以更改数据结构,或者它是否以某种方式固定。你知道吗

相关问题 更多 >