如何逐行遍历GeoPandas DataFrame?解决SA4_CODE21不连续的遍历问题
解决GeoPandas GeoDataFrame逐行遍历问题
问题分析
你之前的循环逻辑存在核心错误:用行索引的i和i+1去匹配SA4_CODE21字段,而SA4_CODE21是不连续的业务编码(如101、191),和行索引完全无关;同时每次循环修改street_map变量,导致后续循环的数据集被错误过滤,最终无法正常运行。
另外iterrows()本身可以正常遍历GeoDataFrame(包括geometry列),你之前的失败应该是用法错误,而非方法本身的问题。
正确的逐行遍历方法
方法1:使用iterrows()(最直观)
iterrows()返回每一行的索引和行数据(Series对象),可以直接访问所有列,包括geometry:
for index, row in street_map.iterrows(): # 提取当前行的字段值 sa4_code = row['SA4_CODE21'] sa4_name = row['SA4_NAME21'] geom = row['geometry'] # 这里写你的处理逻辑,比如生成图片、处理空间数据等 print(f"正在处理: {sa4_name} (编码: {sa4_code})")
方法2:使用itertuples()(更高效)
如果你的数据集较大,itertuples()的遍历速度比iterrows()更快,返回命名元组,可直接通过属性访问字段:
for row in street_map.itertuples(): sa4_code = row.SA4_CODE21 sa4_name = row.SA4_NAME21 geom = row.geometry # 处理逻辑 print(f"正在处理: {sa4_name} (编码: {sa4_code})")
方法3:按SA4_CODE21分组处理(如果需求是按区域批量处理)
如果你的目标是按每个SA4_CODE21对应的区域批量处理数据,而非逐行,可使用groupby:
for sa4_code, group_df in street_map.groupby('SA4_CODE21'): # group_df是对应SA4编码的子GeoDataFrame sa4_name = group_df['SA4_NAME21'].iloc[0] # 批量处理该区域的逻辑,比如生成区域地图 print(f"处理区域: {sa4_name} (编码: {sa4_code}),共{len(group_df)}条数据")
内容的提问来源于stack exchange,提问作者nd_dd22
相关产品推荐
相关产品推荐

