python - 在 Geopandas 数据框中组合行
问题描述
TLDR:我正在尝试将 GeoPandas Dataframe 的行组合成一行,其中它们的形状组合成一个。
我目前正在做一个小项目,该项目需要我使用一些不同的指标创建加拿大健康区域的交互式等值线图。
当我注意到行数不一样时,我合并了两个数据框,一个包含每个健康区域的年度人口估计值,另一个包含健康区域的几何图形的 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_AREA
并且SHAPE_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
属性返回所有几何图形的并集,这给了我所需的新形状。我刚刚使用正确的区域名称和代码将其添加到数据框中,并删除了构成新区域的旧区域。
推荐阅读
- java - 如何告诉spring从外部文件夹加载资源?
- android - 如何将 Post Layout Effect 应用到 ConstraintLayout 2.0
- c# - 如何从我的 WPF 中的任何应用程序访问突出显示/选定的文本?
- can-bus - 响应“50”仅对诊断请求“10 02”切换到编程会话意味着什么?
- forms - 无法设置提交按钮
- spring - HibernateException:使用 DefaultSchemaNameResolver 需要 Dialect 提供正确的 SQL 语句/命令
- php - 存储时关系上的 Laravel 5.0 sync() 不起作用
- python - 如何在 python/selenium 中切换 iframe 工作?
- c - 用于使用指向结构的指针循环结构成员
- php - 每次出现用不同的值替换相同的字符串