You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则提取子路径:从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:10:21