如何将地点数据转换为ISO 3166代码以制作Choropleth地图
解决地点转ISO 3166代码的问题
直接截取Location字段最后字符的思路行不通,因为发射地点的格式大概率不统一(比如有的是“具体场地, 国家”,有的可能包含地区名),而且字符串处理不当很容易出现NaN。下面是几种靠谱的解决方案:
1. 用地理编码工具自动解析
借助geopy库的地理编码功能,能自动识别各种格式的地点字符串,返回对应的ISO代码:
- 先安装库:
pip install geopy - 示例代码:
from geopy.geocoders import Nominatim import pandas as pd # 初始化编码器,user_agent随便填个标识 geolocator = Nominatim(user_agent="launch_loc_converter") def fetch_iso_code(location): try: # 解析地点 loc_data = geolocator.geocode(location, exactly_one=True) if loc_data: # 提取alpha-2格式的代码,转成大写 alpha2_code = loc_data.raw['address'].get('country_code', '').upper() # 如果需要alpha-3格式(比如USA、FRA),可以用映射表转换 alpha2_to_alpha3 = {'US':'USA', 'FR':'FRA', 'RU':'RUS', 'CN':'CHN'} return alpha2_to_alpha3.get(alpha2_code, alpha2_code) return None except Exception: return None # 给数据集新增ISO代码列 df['ISO_Code'] = df['Location'].apply(fetch_iso_code)
2. 手动构建映射字典(适合地点数量少的情况)
如果你的发射地点列表是固定的,直接手动整理每个地点对应的ISO代码,效率更高:
# 手动构建地点到ISO代码的映射 loc_iso_map = { '肯尼迪航天中心': 'USA', '圭亚那太空中心': 'FRA', '拜科努尔航天发射场': 'KAZ', '酒泉卫星发射中心': 'CHN' # 把你数据里的所有地点都补充进来 } # 批量转换 df['ISO_Code'] = df['Location'].map(loc_iso_map) # 处理未匹配的地点(如果有的话) unmatched_locs = df[df['ISO_Code'].isna()]['Location'].unique() print("未匹配的地点:", unmatched_locs) # 手动补充这些地点的映射后重新赋值
3. 优化字符串分割(如果地点格式相对统一)
如果你的Location列格式都是“场地名称, 国家/地区”这种统一格式,可以用字符串分割提取国家,再映射成ISO代码:
# 分割字符串,提取最后一部分(国家) df['Country'] = df['Location'].str.split(', ').str[-1].str.strip() # 国家到ISO代码的映射 country_iso_map = { '美国': 'USA', '法国': 'FRA', '俄罗斯': 'RUS', '中国': 'CHN' } df['ISO_Code'] = df['Country'].map(country_iso_map)
注意:如果有格式不统一的行,这个方法会失效,需要先清理数据(比如处理空值、异常格式的字符串)。
内容的提问来源于stack exchange,提问作者nkdtech
相关产品推荐
相关产品推荐

