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

如何基于国家短码用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:10:42