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

基于正则匹配排除DataFrame中格式不符的GPS纬度数据行

可行实现方案

你可以根据自己的场景选择以下两种方案,核心逻辑都是先明确合法坐标的结构规则:[<度(整数)>, <分(整数)>, <秒(整数/分数)>],不符合该结构的直接过滤。

方案1:正则匹配过滤(速度快,适合格式统一的数据集)

匹配规则直接排除分位为分数、末位为0的非法格式,代码如下:

import pandas as pd

# 匹配合法坐标的正则规则
valid_coord_re = r'^\[\d{1,2}, \d{1,2}, (?:\d+|\d+\/\d+)\]$'
# 仅保留匹配成功的行
df_clean = df[df['GPS GPSLatitude'].str.match(valid_coord_re)]

规则说明:

  • 要求第二位(分位)必须是1-2位整数,直接过滤分位是分数的非法数据
  • 要求第三位(秒位)为纯数字或者数字/数字的分数格式
  • 严格匹配方括号包裹的三段结构,避免其他异常格式漏判

方案2:结构解析校验(准确率高,适合格式复杂的数据集)

将坐标字符串解析为Python列表后逐位校验,容错性更高,代码如下:

import pandas as pd
import ast

def check_coord_valid(coord_str):
    try:
        coord = ast.literal_eval(coord_str)
        # 校验列表长度必须为3
        if len(coord) != 3:
            return False
        # 校验度、分均为整数,且分不超过59
        if not isinstance(coord[0], int) or not isinstance(coord[1], int) or coord[1] >= 60:
            return False
        # 校验秒位为合法值
        sec = coord[2]
        if isinstance(sec, int):
            # 整数秒需小于60
            return sec < 60
        elif isinstance(sec, str) and '/' in sec:
            # 分数秒需确保斜杠前后都是数字
            num, den = sec.split('/', 1)
            return num.strip().isdigit() and den.strip().isdigit()
        # 若数据中分数已被解析为浮点型,可补充浮点类型校验
        return isinstance(sec, (float, int))
    except:
        # 解析失败直接判定为非法
        return False

# 过滤非法行
df_clean = df[df['GPS GPSLatitude'].apply(check_coord_valid)]

内容的提问来源于stack exchange,提问作者Jordan P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 18:51:03