如何在含Geometry的GeoPandas DataFrame中按行拆分数据?
解决GeoDataFrame拆分列时保留几何列的问题
错误原因
你遇到的TypeError是因为所用的旧版本geopandas中,explode()方法是专门用于拆分几何列(比如MultiPolygon转单个Polygon)的,只能接收自身参数,不支持指定要拆分的非几何列名。而当你移除Geometry列后,对象变成了普通pandas DataFrame,此时调用的是pandas的explode()方法,支持指定列名,所以能正常运行。
解决方案
方案1:升级geopandas到新版本
新版本的geopandas已经兼容了pandas的explode()方法,支持直接指定非几何列进行拆分,同时保留几何列。执行升级命令:
pip install --upgrade geopandas
升级后直接运行你原来的代码即可:
test.assign(state=test["state_names"].str.split("--")).explode('state')
方案2:转成普通DataFrame处理后转回GeoDataFrame
如果不想升级版本,可以先将GeoDataFrame转为普通DataFrame,拆分完成后再转回GeoDataFrame:
import pandas as pd import geopandas as gpd # 1. 将GeoDataFrame转为普通DataFrame(保留所有列,包括geometry) df = pd.DataFrame(test) # 2. 拆分state列并展开 df_exploded = df.assign(state=df["state_names"].str.split("--")).explode('state') # 3. 转回GeoDataFrame,指定几何列名称 gdf_exploded = gpd.GeoDataFrame(df_exploded, geometry='geometry')
方案3:用apply+Series手动展开
这种方法不依赖版本,通过逐行处理实现拆分:
gdf_exploded = test.assign(state=test["state_names"].str.split("--")).apply( lambda row: pd.Series({ 'city': row['city'], 'state_names': row['state_names'], 'state': row['state'], 'geometry': row['geometry'] }), axis=1 ).explode('state')
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

