如何合并Python字典中按小时分组的嵌套键值对
合并按小时分组的区域统计字典
假设你的原始字典结构类似这样(键是(小时, 区域索引)元组,值包含区域的面积和平均强度):
original_dict = { (0, 0): {'area': 120, 'mean_intensity': 45.2}, (0, 1): {'area': 85, 'mean_intensity': 52.7}, (1, 0): {'area': 98, 'mean_intensity': 48.1}, (1, 1): {'area': 112, 'mean_intensity': 50.3}, (1, 2): {'area': 76, 'mean_intensity': 46.8} }
你可以通过遍历原字典,按小时分组聚合统计数据,实现步骤如下:
1. 初始化合并结果字典
创建一个空字典,用来存储每个小时的汇总统计:
merged_dict = {}
2. 遍历原字典并聚合数据
遍历每个键值对,提取小时信息,累加对应统计项:
for (hour, _), region_data in original_dict.items(): # 提取当前区域的面积和平均强度 area = region_data['area'] mean_int = region_data['mean_intensity'] if hour not in merged_dict: # 首次遇到该小时,初始化统计项 merged_dict[hour] = { 'region_count': 1, 'total_area': area, 'sum_intensity': mean_int, 'sum_weighted_intensity': mean_int * area } else: # 该小时已存在,更新统计项 merged_dict[hour]['region_count'] += 1 merged_dict[hour]['total_area'] += area merged_dict[hour]['sum_intensity'] += mean_int merged_dict[hour]['sum_weighted_intensity'] += mean_int * area
3. 计算最终的平均强度
根据需求计算两种常见的平均强度:
- 区域算术平均强度:所有区域平均强度的平均值
- 面积加权平均强度:整个小时内所有像素的平均强度(更能反映整体强度水平)
for hour in merged_dict: stats = merged_dict[hour] # 计算区域算术平均强度 stats['mean_intensity_regions'] = stats['sum_intensity'] / stats['region_count'] # 计算面积加权平均强度 stats['mean_intensity_weighted'] = stats['sum_weighted_intensity'] / stats['total_area'] # 删除临时统计项,保持字典整洁 del stats['sum_intensity'], stats['sum_weighted_intensity']
最终结果
处理后的merged_dict结构如下:
{ 0: { 'region_count': 2, 'total_area': 205, 'mean_intensity_regions': 48.95, 'mean_intensity_weighted': 48.2341... }, 1: { 'region_count': 3, 'total_area': 286, 'mean_intensity_regions': 48.4, 'mean_intensity_weighted': 48.6713... } }
补充说明
- 如果原始数据包含其他统计项,只需在初始化和更新阶段对应添加累加逻辑即可。
- 若需保留每个小时下的所有区域详细数据,可先将每个小时对应的值设为列表收集数据,再做聚合统计:
merged_dict = {} for (hour, idx), region_data in original_dict.items(): if hour not in merged_dict: merged_dict[hour] = [] merged_dict[hour].append(region_data) # 对每个小时的区域列表做统计 for hour, regions in merged_dict.items(): region_count = len(regions) total_area = sum(r['area'] for r in regions) mean_regions = sum(r['mean_intensity'] for r in regions) / region_count mean_weighted = sum(r['mean_intensity'] * r['area'] for r in regions) / total_area merged_dict[hour] = { 'region_count': region_count, 'total_area': total_area, 'mean_intensity_regions': mean_regions, 'mean_intensity_weighted': mean_weighted }
内容的提问来源于stack exchange,提问作者SAVen
相关产品推荐
相关产品推荐

