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

如何在Pandas对象中用子串替换值?纬度数值提取问题求助

解决Latitude列提取数字部分的问题

嘿,我来帮你搞定这个问题!先说说你之前代码报错的原因:你用raw.loc[(raw['LATITUDE'].str.len() == 9)]取出的是整个DataFrame子集,而str是pandas Series的专属方法,直接在DataFrame上调用str自然会触发AttributeError啦。

下面给你几种可行的方法,其中正则表达式的方案是最通用的,推荐优先使用:

方法1:修复你原来的代码逻辑

如果你确定只有长度为9的字符串需要处理,那可以调整代码,针对LATITUDE这个Series操作,而不是整个DataFrame:

# 先确保列是字符串类型(如果原始数据是数值型的话必须转换)
raw['LATITUDE'] = raw['LATITUDE'].astype(str)
# 只对符合长度条件的行赋值
raw.loc[raw['LATITUDE'].str.len() == 9, 'LATITUDE'] = raw['LATITUDE'].str[0:8]

方法2:更通用的正则表达式方案(推荐)

这个方法不用依赖固定的字符串长度,不管你的纬度值是12.3456N还是90.123456S,都能准确提取数字(包括小数点):

# 先转字符串类型
raw['LATITUDE'] = raw['LATITUDE'].astype(str)
# 使用str.extract提取数字部分
raw['LATITUDE'] = raw['LATITUDE'].str.extract(r'([\d.]+)', expand=False)

补充说明:

  • r'([\d.]+)'是正则表达式,用来匹配一个或多个数字或小数点,刚好对应纬度的数值部分;
  • expand=False让方法返回Series,直接就能赋值给原列;
  • 如果有些行可能没有匹配到数字,可以加fillna处理空值,比如:
    raw['LATITUDE'] = raw['LATITUDE'].astype(str).str.extract(r'([\d.]+)', expand=False).fillna('')
    

方法3:用apply配合正则函数

如果你习惯用apply,也可以这么写:

import re
raw['LATITUDE'] = raw['LATITUDE'].astype(str).apply(lambda x: re.findall(r'[\d.]+', x)[0] if re.findall(r'[\d.]+', x) else '')

总结一下,正则表达式的方案是最优的,因为它不限制字符串长度,适配各种格式的纬度值,容错性更强。

内容的提问来源于stack exchange,提问作者ekim420

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:34