如何在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
相关产品推荐
相关产品推荐

