合并GeoDataFrame与Excel数据集时遇到列类型转换及索引操作错误的解决方案咨询
合并GeoDataFrame与Excel数据集时遇到列类型转换及索引操作错误的解决方案咨询
问题分析
先帮你拆解两个错误的根源:
- 第一个
ValueError:你转置Excel数据后,transjakarta_data的index列里包含了'Rata-rata Harlan'这个非数值的汇总行,直接用apply(int)转换整数值时,这个字符串无法被解析成整数,所以抛出错误。 - 第二个
AttributeError:reset_index()之后你调用的是DataFrame的**默认索引(RangeIndex)**的apply方法,但RangeIndex是内置的序列索引对象,没有apply属性,你要操作的是数据列而非索引本身。
完整解决方案代码
下面是修正后的完整流程,每一步都加了注释说明:
import pandas as pd import geopandas as gpd # 1. 读取原始数据 transjakarta_lines = gpd.read_file('https://raw.githubusercontent.com/lokalhangatt/stackoverlow/refs/heads/main/dataviz_day13/transjakarta_lines.geojson') # 读取Excel时保留原始结构,后续再处理转置 transjakarta_data = pd.read_excel("https://github.com/lokalhangatt/stackoverlow/raw/refs/heads/main/dataviz_day13/TJ_Agustus_2020.xlsx", index_col=0) # 2. 处理Excel数据:转置+过滤无效行+类型转换 # 转置数据,将原行索引转为新的列并命名为'koridor' transjakarta_data = transjakarta_data.T.reset_index(names='koridor') # 过滤掉非数字的koridor行(比如汇总用的'Rata-rata Harlan') transjakarta_data = transjakarta_data[transjakarta_data['koridor'].str.isdigit()] # 把koridor列转换成整数类型(此时所有行都是纯数字,转换不会报错) transjakarta_data['koridor'] = transjakarta_data['koridor'].astype(int) # 3. 统一GeoDataFrame的koridor列类型 transjakarta_lines['koridor'] = transjakarta_lines['koridor'].astype(int) # 4. 按指定键合并两个数据集 # 明确指定合并键为'koridor',避免自动匹配其他同名列的潜在问题 transjakarta = pd.merge(transjakarta_lines, transjakarta_data, on='koridor') # 5. 规范初始化GeoDataFrame # 直接指定几何列和坐标系,不需要后续手动赋值 transjakarta = gpd.GeoDataFrame(transjakarta, geometry='geometry', crs=transjakarta_lines.crs) # 6. 转换为目标坐标系 epsg_jkt = 5330 transjakarta_planar = transjakarta.to_crs(epsg=epsg_jkt)
关键修正点说明
- 过滤无效行:用
str.isdigit()筛选出koridor列里的纯数字行,排除汇总行,从根源避免类型转换失败。 - 高效类型转换:用
astype(int)替代apply(int),整列转换更高效,且逻辑更清晰。 - 明确合并逻辑:
pd.merge时指定on='koridor',让合并规则更透明,减少意外匹配。 - 规范GeoDataFrame操作:合并时直接初始化地理数据框的核心属性,避免后续手动赋值可能出现的不兼容问题。
这样处理后,两个数据集就能正常合并,同时完整保留GeoDataFrame的地理属性,后续坐标系转换也能顺利执行。
备注:内容来源于stack exchange,提问作者lokalhangatt
相关产品推荐
相关产品推荐

