仅坐标满足指定区间时创建year键并累加同键数值的Python实现问题
解决方案
你的原有代码问题出在初始化逻辑:只要首次碰到某一年的记录,不管该条记录是否符合经纬度要求,都会直接给g_coords注册对应年份的键,导致不符合坐标条件的年份也会出现在最终结果里。
下面给出两种可行修改方案:
方案1:保留原有循环结构(适配你要保留avg_lat逻辑的要求)
直接调整g_coords的初始化和累加逻辑,只有符合坐标条件的条目才会操作g_coords:
avg_lat = {} g_coords = {} for year, lat, num, long in zip(years, latitudes, quantities, longitudes): # 保留你需要的avg_lat逻辑不动 if year in avg_lat: avg_lat[year] += lat else: avg_lat[year] = lat # 仅针对符合坐标条件的条目操作g_coords if 58.50 > lat > 56.83 and 17.83 > long > 15.26: if year in g_coords: g_coords[year] += num else: g_coords[year] = num return g_coords
方案2:使用numpy向量化运算(数据量大时效率更高)
先筛选出所有符合坐标条件的记录,再按年份聚合求和:
import numpy as np # 先构造符合条件的布尔掩码 mask = (latitudes > 56.83) & (latitudes < 58.50) & (longitudes > 15.26) & (longitudes < 17.83) # 筛选符合条件的年份和对应数量 filter_years = years[mask] filter_nums = quantities[mask] # 按年份去重并按quantities权重统计总和 unique_years, indices = np.unique(filter_years, return_inverse=True) counts = np.bincount(indices, weights=filter_nums).astype(int) # 转成字典格式 g_coords = dict(zip(unique_years, counts)) # 你要保留的avg_lat逻辑如果需要保留,可以单独遍历计算即可 return g_coords
两种方案都可以保证最终g_coords里只存在有符合坐标条件记录的年份,且对应值为该年所有符合条件条目的quantity累加和。
内容的提问来源于stack exchange,提问作者eyad mardini
相关产品推荐
相关产品推荐

