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

从多格式位置信息的Pandas数据框中提取经纬度坐标的实现问题

从多格式位置信息的Pandas数据框中提取经纬度坐标的实现问题

看起来你在处理多格式位置数据时遇到了正则匹配的瓶颈,我来帮你梳理下问题根源,再给出针对性的解决方案~

一、原代码的问题分析

你的代码没匹配到目标坐标,主要是三个细节没考虑到:

  1. 整行匹配限制:正则里的^和$要求整行完全符合坐标格式,但像第三行(40.611712, ‐103.234619), Sterling, CO 80751后面跟着额外内容,直接被排除了;
  2. 负号类型不兼容:你示例里的负号是全角负号(‐),但原正则只匹配半角负号(-),导致这类坐标被漏掉;
  3. 空格强制要求:正则里的\s要求逗号后必须有空格,但第二个例子39.643114,‐104.716489没有空格,匹配失败。

二、针对性解决方案

场景1:筛选包含目标坐标的行

如果你只是想先把所有带x,y格式坐标的行挑出来,用Pandas的str.contains配合修正后的正则更高效:

import pandas as pd
import re

# 模拟你的数据框
csg = pd.DataFrame({
    "Locations": [
        "12010 HWY 61",
        "39.643114,‐104.716489",
        "(40.611712, ‐103.234619), Sterling, CO 80751",
        "39.111393, ‐108.410419",
        "40°29'59.8\"N, 104°37'14.9\"W"
    ]
})

# 修正后的正则:兼容半/全角负号、逗号后可选空格,允许坐标出现在行内任意位置
coords_pattern = r'-?\d+\.\d+,\s?[‐-]?\d+\.\d+'

# 筛选符合条件的行
filtered_rows = csg[csg["Locations"].str.contains(coords_pattern, regex=True)]
print(filtered_rows)

场景2:提取具体的经纬度值

如果还需要把坐标从文本里剥离出来,生成单独的纬度/经度列,用str.extract更合适:

# 支持带括号的坐标格式,精准提取经纬度数值
extract_pattern = r'[(-]?(-?\d+\.\d+),\s?[‐-]?(\d+\.\d+)[)]?'

# 提取并生成新列
csg[["Latitude", "Longitude"]] = csg["Locations"].str.extract(extract_pattern)

# 过滤掉无有效坐标的行(地址、度分秒格式)
result = csg.dropna(subset=["Latitude", "Longitude"])
print(result)

场景3:修正你的循环代码

如果你坚持要用iterrows的方式,只需要把正则改成非整行匹配,同时兼容半/全角负号:

xy = []
coords_pattern = r'-?\d+\.\d+,\s?[‐-]?\d+\.\d+'

for i, row in csg.iterrows():
    # 用search代替match,允许坐标出现在行内任意位置
    if re.search(coords_pattern, row["Locations"]):
        xy.append(row)

# 转成数据框方便查看
xy_df = pd.DataFrame(xy)
print(xy_df)

三、关键正则说明

给你拆解下修正后正则的核心部分:

  • [‐-]:同时匹配半角负号-和全角负号‐,解决示例中的负号兼容问题;
  • \s?:匹配0个或1个空格,兼容逗号后有无空格的情况;
  • 去掉^和$:允许坐标出现在行内任何位置,适配带额外地址信息的行;
  • [(-]?和[)]?:可选匹配开头的(或-、结尾的),兼容带括号的坐标格式。

备注:内容来源于stack exchange,提问作者cascad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:48:11