在地理数据分析中,我们常常拥有带有年份和地区字段的数值表,以及与之对应的地区边界多边形。为了后续批量生成制图或建模用的多边形,需要按年份和地区算出均值,并为每个地区多边形生成一个循环的索引编号,方便在循环中依次取用。

一、准备示例数据
先用pandas构造一份包含年份、地区与数值的宽表,再用geopandas准备地区多边形。这里以简化数据为例。
import pandas as pd
import geopandas as gpd
from shapely.geometry import Polygon
# 数值表
records = [
{'year': 2020, 'region': 'A', 'value': 10},
{'year': 2020, 'region': 'A', 'value': 20},
{'year': 2020, 'region': 'B', 'value': 5},
{'year': 2021, 'region': 'A', 'value': 15},
{'year': 2021, 'region': 'B', 'value': 8},
{'year': 2021, 'region': 'B', 'value': 12},
]
df = pd.DataFrame(records)
# 多边形表
polys = gpd.GeoDataFrame({
'region': ['A', 'B'],
'geometry': [Polygon([(0,0),(1,0),(1,1)]), Polygon([(1,0),(2,0),(2,1)])]
}, crs='EPSG:4326')
二、按年份和地区分组计算均值
使用groupby可以同时按多列分组,并用mean()得到每个组合的平均值。
# 按年份和地区分组求均值 mean_df = df.groupby(['year', 'region'], as_index=False)['value'].mean() print(mean_df)
得到的结果包含year、region与value三列,每一行是一个年份地区组合的平均观测。
三、为多边形构建生成循环索引
假设我们需要对每个地区多边形按出现顺序生成一个从0开始的循环索引,可先取出去重后的地区列表,再映射回多边形表。
# 地区唯一列表
regions = polys['region'].tolist()
# 生成循环索引映射
loop_index = {r: i for i, r in enumerate(regions)}
# 为多边形添加循环索引字段
polys['loop_id'] = polys['region'].map(loop_index)
print(polys)
若后续要按年份循环构建多边形,可将mean_df与polys通过region字段合并,再在循环中用loop_id控制批次。
四、合并均值与多边形并循环使用
下面演示把均值表与多边形按地区连接,并按loop_id遍历生成子图形。
# 以最新年份为例合并
latest = mean_df[mean_df['year'] == mean_df['year'].max()]
merged = polys.merge(latest, on='region', how='left')
# 循环索引构建
for lid, sub in merged.groupby('loop_id'):
print('循环索引', lid, '地区', sub['region'].values, '均值', sub['value'].values)
# 此处可调用多边形构建或导出函数
五、小结
通过上述步骤,我们完成了按年份和地区分组求均值,并为多边形生成了可用的循环索引。该模式可扩展到更多维度,只需调整groupby字段与映射逻辑即可。