含np.nan几何值的DataFrame转GeoDataFrame报错的解决方法
保留含空几何值的DataFrame转GeoDataFrame方案
问题场景
将包含np.nan几何值的Pandas DataFrame转换为GeoDataFrame时,直接调用wkt.loads会触发TypeError: Only str is accepted.,因为wkt.loads无法处理非字符串类型的空值,同时需要保留含空值的行,不能删除。
修正后的基础代码(先修正原代码笔误)
原代码存在两处笔误:DataFrame的列名未加引号,以及后续引用列名时写错(geom应为geo),修正后代码如下:
import pandas as pd import geopandas as gpd import numpy as np from shapely import wkt df = pd.DataFrame({ 'id': [0, 1, 2, 3], 'geo': [ 'POLYGON ((35.067912 -106.700884, 35.066714 -106.70128, 35.066555 -106.700697, 35.066492 -106.700468, 35.066134 -106.700367, 35.066088 -106.700129, 35.066062 -106.700005, 35.067519 -106.699412, 35.06763 -106.69937, 35.067659 -106.699537, 35.067737 -106.699977, 35.067814 -106.700378, 35.067891 -106.700773, 35.067912 -106.700884))', np.nan, 'POLYGON ((35.067912 -106.700884, 35.066714 -106.70128, 35.066555 -106.700697, 35.066492 -106.700468, 35.066134 -106.700367, 35.066088 -106.700129, 35.066062 -106.700005, 35.067519 -106.699412, 35.06763 -106.69937, 35.067659 -106.699537, 35.067737 -106.699977, 35.067814 -106.700378, 35.067891 -106.700773, 35.067912 -106.700884))', np.nan ] })
解决方案1:自定义函数处理空值
通过自定义函数,对空值返回None(GeoPandas会将其识别为空几何),非空值调用wkt.loads解析:
def parse_wkt(geo_str): if pd.isna(geo_str): return None return wkt.loads(geo_str) usgeo = gpd.GeoDataFrame(df) usgeo['geometry'] = usgeo['geo'].apply(parse_wkt) # 可选:根据数据实际坐标系设置,示例为WGS84 usgeo = usgeo.set_crs("EPSG:4326")
解决方案2:使用GeoPandas内置的from_wkt方法(推荐)
GeoPandas提供了gpd.GeoSeries.from_wkt方法,原生支持处理空值,无需自定义函数:
# 直接将geo列转换为GeoSeries,自动处理空值 usgeo = gpd.GeoDataFrame(df, geometry=gpd.GeoSeries.from_wkt(df['geo'])) # 可选:根据数据实际坐标系设置,示例为WGS84 usgeo = usgeo.set_crs("EPSG:4326")
效果说明
两种方法都能保留含np.nan的行,转换后的GeoDataFrame中,空值对应的geometry列会被标记为None(在GeoPandas中代表空几何),不会丢失任何数据行。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

