合并 Geopandas 数据框中的行

Combining rows in a Geopandas Dataframe

TLDR:我正在尝试将 GeoPandas Dataframe 的行合并为一行,其中它们的形状合并为一个。

我目前正在做一个小项目,需要我使用一些不同的指标来创建加拿大卫生区域的交互式等值线图。

我合并了两个 Dataframes,一个包含每个健康区域按年份估计的人口,另一个 GeoDataframe 包含健康区域的几何图形,当我注意到行数不一样时。

经过进一步检查,我意识到我一直使用的两个数据集并不包含完全相同的健康区域。我得到的形状文件比人口数据有更多的健康区域,人口数据出于方法论的原因合并了其中的一些。

注意到差异后,我重新合并以显示差异,这样我就可以弄清楚我需要汇总什么。

merged_gdf = gdf.merge(df, on='HR_UID') 
#HR_UID is just the name of the column with the codes for the health regions, since they   
#have slightly different names in different datasets, it's easier to merge on code.
print(list(set(df['HEALTH_REGION'])-set(merged_gdf['HEALTH_REGION_y'])),list(set(gdf['HR_UID'])-set(df['HR_UID'].unique())))

我在这里看到缺少的健康区域是 ['Mamawetan/Keewatin/Athabasca, Saskatchewan']。 GeoDataframe 将这三个区域分开,代码为 4711、4712、4713,而人口数据将它们汇总到一个代码为 4714 的区域中。

我打算合并我的 GeoDataframe 中与人口数据中合并的健康区域相对应的行,以合并它们的多边形。 我回到 GeoDataframe 尝试合并与这些区域对应的三行:

old_hr=gdf[gdf['HR_UID'].isin({'4711','4712','4713'})]
  HR_UID                                      HEALTH_REGION    SHAPE_AREA  \
31   4711  Mamawetan Churchill River Regional Health Auth...  1.282120e+11   
32   4712          Keewatin Yatthé Regional Health Authority  1.095536e+11   
33   4713                         Athabasca Health Authority  5.657720e+10   

       SHAPE_LEN                                           geometry  
31  1.707619e+06  POLYGON ((5602074.666 2364598.029, 5591985.366...  
32  1.616297e+06  POLYGON ((5212469.723 2642030.691, 5273110.000...  
33  1.142962e+06  POLYGON ((5248633.914 2767057.263, 5249285.640...  

现在我意识到我不确定如何在 GeoDataframe 中组合多边形。我试过使用 dissolve(on='HEALTH_REGION'),尽管那没有用。我花了一段时间在网上四处寻找,但到目前为止,我似乎找不到任何人问这个特定的问题 - 也许我遗漏了什么..

事实证明它实际上比我想象的要简单,我只是对数据框中的一些附加列感到困惑,这些列实际上并不是映射所必需的。我是 Geopandas 的新手和一般的制图,所以我没有意识到 SHAPE_AREASHAPE_LEN 实际上并不需要。

这是我用来导入没有额外列的数据框然后组合 3 个多边形的代码:

# if this is not "pythonic" let me know, I'm still a python rookie, but this  
# worked for me. 

gdf = gpd.read_file('data/HR_Boundary_Files/HR_000b18a_e.shp', encoding='utf-8').drop(columns={'FRENAME', 'SHAPE_AREA','SHAPE_LEN'})
gdf.rename(columns={'ENGNAME':'HEALTH_REGION'}, inplace=True)
old_hr=gdf[gdf['HR_UID'].isin({'4711','4712','4713'})]
gdf=gdf[~gdf['HR_UID'].isin({'4711','4712','4713'})]
new_region_geometry = old_hr['geometry'].unary_union
gdf=gdf.append(pd.Series(['4714', 'Mamawetan/Keewatin/Athabasca Health Region', new_region_geometry], 
                         index=gdf.columns), ignore_index=True)

GeoSeries unary_union 属性 returns 所有几何图形的联合,这给了我需要的新形状。我只是用正确的区域名称和代码将其添加到数据框中,并删除了构成新区域的旧区域。