从多格式位置信息的Pandas数据框中提取经纬度坐标的实现问题
从多格式位置信息的Pandas数据框中提取经纬度坐标的实现问题
看起来你在处理多格式位置数据时遇到了正则匹配的瓶颈,我来帮你梳理下问题根源,再给出针对性的解决方案~
一、原代码的问题分析
你的代码没匹配到目标坐标,主要是三个细节没考虑到:
- 整行匹配限制:正则里的
^和$要求整行完全符合坐标格式,但像第三行(40.611712, ‐103.234619), Sterling, CO 80751后面跟着额外内容,直接被排除了; - 负号类型不兼容:你示例里的负号是全角负号(‐),但原正则只匹配半角负号(-),导致这类坐标被漏掉;
- 空格强制要求:正则里的
\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
相关产品推荐
相关产品推荐

