如何从OSMnx生成的MultiIndex结构节点、边GeoDataFrame中提取目标数据
问题解决方法
边GeoDataFrame(三级复合索引)查询指定u、v的边长度
OSMnx生成的边GeoDataFrame默认采用(u, v, key)三级MultiIndex,u和v为节点ID,key用于区分同一对节点之间的多条平行边,可任选以下两种方案查询:
- 方案1:基于MultiIndex直接查询
不需要修改原数据结构,对仅知道u、v值的场景,用slice(None)占位匹配任意key值,示例代码:
如果需要同时查询u→v和v→u的双向边,可配合# 替换为你实际要查询的u、v节点ID,默认节点ID为整数类型不需要加引号 query_u = 12345 query_v = 67890 # 返回所有u=query_u、v=query_v的边的length字段,有平行边会返回多个值 edge_lengths = edges.loc[(query_u, query_v, slice(None)), "length"]pd.IndexSlice实现:import pandas as pd idx = pd.IndexSlice bidirect_lengths = edges.loc[idx[[query_u, query_v], [query_u, query_v], :], "length"] # 过滤掉u=v的无效匹配结果 bidirect_lengths = bidirect_lengths[bidirect_lengths.index.get_level_values("u") != bidirect_lengths.index.get_level_values("v")] - 方案2:转换为普通列查询(更易读)
把复合索引转为普通列后用布尔条件筛选,适合对MultiIndex不熟悉的场景:edges_reset = edges.reset_index() edge_lengths = edges_reset[(edges_reset["u"] == query_u) & (edges_reset["v"] == query_v)]["length"]
节点GeoDataFrame查询指定NodeID的属性
你之前查询失败的核心原因通常是两个:1. 传入的NodeID类型和索引类型不匹配(比如索引是整数但你传了字符串);2. .loc的第二个参数应为列名而非列位置,正确查询方法如下:
- 先确认节点索引类型,避免类型不匹配:
# 输出索引类型,OSMnx默认返回int类型的节点ID print(nodes.index.dtype) # 输出前5条索引,核对格式 print(nodes.index[:5]) - 按正确格式查询y属性:
# 若索引为int类型,直接传整数ID y_value = nodes.loc[46367195, "y"] # 若索引为str类型,给ID加引号 # y_value = nodes.loc["46367195", "y"]
内容的提问来源于stack exchange,提问作者Pim Hofste
相关产品推荐
相关产品推荐

