如何基于国家短码用Geopy提取并拆分Pandas经纬度列
解决方法
首先明确:Geopy返回的location列元素是Location对象,自带address(地址信息)和point(经纬度Point对象)属性,不能用普通切片或explode拆分,得通过提取对象属性来处理。
1. 从Location对象提取目标字段
直接用apply函数提取国家名称、纬度、经度:
# 假设你的short_code_df中,location列是Geopy返回的Location实例 # 提取国家名称(从address拆分,若格式固定则可用;否则看下方raw属性方法) short_code_df['country'] = short_code_df['location'].apply(lambda x: x.address.split(',')[-1].strip() if x else None) # 提取纬度和经度 short_code_df['lat'] = short_code_df['location'].apply(lambda x: x.point.latitude if x else None) short_code_df['lon'] = short_code_df['location'].apply(lambda x: x.point.longitude if x else None)
如果地址拆分不可靠(比如部分国家的address结构特殊),可以用Geopy返回的原始API数据提取精准国家名(以Nominatim为例):
short_code_df['country'] = short_code_df['location'].apply( lambda x: x.raw['address']['country'] if x and 'address' in x.raw else None )
2. 合并回原10万行DataFrame
因为你是基于唯一国家短码处理的,直接用短码列做关联合并,把坐标批量同步回原表:
# 假设原DataFrame名为original_df,国家短码列是'country_code' original_df = original_df.merge( short_code_df[['country_code', 'country', 'lat', 'lon']], on='country_code', how='left' )
特殊情况处理:location列是字符串格式
如果之前不小心把Location对象转成了字符串(比如打印后保存),可以用正则提取:
import re # 示例字符串格式:"Location(中国, (35.8617, 104.1954))" short_code_df['lat'] = short_code_df['location'].apply( lambda x: float(re.search(r'\((-?\d+\.\d+), (-?\d+\.\d+)\)', x).group(1)) if x else None ) short_code_df['lon'] = short_code_df['location'].apply( lambda x: float(re.search(r'\((-?\d+\.\d+), (-?\d+\.\d+)\)', x).group(2)) if x else None ) short_code_df['country'] = short_code_df['location'].apply( lambda x: re.search(r'Location\((.*?),', x).group(1).strip() if x else None )
内容的提问来源于stack exchange,提问作者Jay Cheng
相关产品推荐
相关产品推荐

