正则提取子路径:从DataFrame的place字段获取倒数第二个路径段
解决方法:提取层级地点并避免重名的地理编码
我来帮你一步步搞定这个问题——核心思路是先从place字段拆分出所需的层级地点,再组合省/州和城市信息做地理编码,彻底解决重名城市的识别问题。
第一步:用Python提取目标地点字段
假设你的df是Pandas DataFrame,我们先把place字段按/拆分,分别提取倒数第二个部分(对应provinceName1)和最后一个部分(对应cityName0),再把两者组合成带归属地的完整地点,避免像Perth这类重名城市的混淆。
代码示例:
import pandas as pd # 拆分place字段为层级列表 df['place_parts'] = df['place'].str.split('/') # 提取倒数第二个/后的内容作为provinceName1 df['provinceName1'] = df['place_parts'].str[-2] # 提取最后一个/后的内容作为cityName0 df['cityName0'] = df['place_parts'].str[-1] # 组合成「省/州, 城市」的格式,用于地理编码 df['full_location'] = df['provinceName1'] + ', ' + df['cityName0']
如果遇到place字段格式不统一的情况(比如有的记录只有1个/),可以加个容错处理:
def extract_locations(place_str): parts = place_str.split('/') if len(parts) >= 2: return parts[-2], parts[-1] # 格式不符合时返回原字符串作为兜底 return place_str, place_str # 批量处理并拆分到新列 df[['provinceName1', 'cityName0']] = df['place'].apply( lambda x: pd.Series(extract_locations(x)) ) df['full_location'] = df['provinceName1'] + ', ' + df['cityName0']
第二步:用ggmap进行精准地理编码
接下来用R语言的ggmap库进行地理编码,用我们组合好的full_location作为查询词,这样即使城市名重复,带上省/州信息也能准确定位。
注意:如果使用Google Maps的地理编码服务,需要先注册API密钥;如果用免费的OpenStreetMap Nominatim服务,无需密钥但要注意请求频率限制。
示例代码(Google Maps服务):
library(ggmap) # 注册你的Google Maps API密钥 register_google(key = "你的API密钥") # 批量获取经纬度 geo_data <- geocode(df$full_location, output = "latlon") # 把地理编码结果合并回原数据框 df <- cbind(df, geo_data)
示例代码(免费Nominatim服务):
library(ggmap) # 使用OpenStreetMap的Nominatim服务 geo_data <- geocode(df$full_location, output = "latlon", source = "osm") # 合并结果 df <- cbind(df, geo_data)
这样处理后,你就能得到每个地点的准确经纬度,完全避开重名城市的识别误差啦。
内容的提问来源于stack exchange,提问作者aterhorst
相关产品推荐
相关产品推荐

