GeoDataFrame按几何类型子集化返回NoneType问题排查
问题解决:拆分GeoDataFrame时返回None导致AttributeError
错误根源
subset_line(gdf)返回了None,调用head()时触发AttributeError: 'NoneType' object has no attribute 'head'。
解决办法
检查函数缩进
确保return result语句属于函数体内部(和函数内的赋值语句缩进一致)。错误的缩进会让函数默认返回None,正确写法如下:def subset_line(x): result = x[x['geometry'].geom_type == 'LineString'] return result # 此处缩进必须与上一行对齐 def subset_point(x): result = x[x['geometry'].geom_type == 'Point'] return result确认传入的GeoDataFrame有效
调用函数时传入的gdf必须是已正确加载的GeoDataFrame对象,而非None。可以先打印gdf确认其是否正常初始化或加载。处理空结果场景
如果GeoDataFrame中没有对应类型的几何对象,筛选后会得到空GeoDataFrame(不是None),此时head()不会报错,但可以添加提示方便排查:def subset_line(x): result = x[x['geometry'].geom_type == 'LineString'] if result.empty: print("提示:未找到LineString类型的几何对象") return result
优化方案
将两个函数合并为一个,一次返回两个子集,减少重复代码:
def split_gdf_by_geom(gdf): line_subset = gdf[gdf['geometry'].geom_type == 'LineString'] point_subset = gdf[gdf['geometry'].geom_type == 'Point'] return line_subset, point_subset # 使用示例 gdf_line, gdf_point = split_gdf_by_geom(gdf)
内容的提问来源于stack exchange,提问作者Dimas Rizqi
相关产品推荐
相关产品推荐

