Python中基于现有列映射值至新增DataFrame列及CSV城市地理编码需求
通用CSV地理编码工具实现方案
我正在开发一款能处理任意含城市列CSV的通用地理编码工具,目标是把城市名转换成对应的纬度(Latitudes)和经度(Longitudes)。结合你给出的示例CSV,我梳理了一套可行的实现步骤,分享给你:
示例CSV内容
Time,M1,M2,M3,CityName temp,num,num,num,loc 20-May-13,19,20,0,delhi 20-May-13,25,42,7,agra 20-May-13,23,35,4,mumbai 20-May-13,21,32,3,delhi 20-May-13,17,27,1,mumbai 20-May-13,16,40,5,delhi
核心实现步骤
1. 提取城市列的唯一值
这一步是为了减少重复的地理编码请求,提升效率并避免浪费API配额:
- 读取CSV文件后,通过第二行的变量类型标记,自动识别出
loc类型的列(示例中为CityName) - 从该列中提取所有不重复的城市名称,比如示例里的
delhi、agra、mumbai
2. 对唯一城市执行地理编码
拿到唯一城市列表后,调用地理编码服务完成转换:
- 针对每个唯一城市发起编码请求,将结果存储为键值对结构(城市名对应经纬度),比如:
geocode_mapping = { "delhi": (28.6139, 77.2090), "agra": (27.1767, 78.0081), "mumbai": (19.0760, 72.8777) } - 加入异常处理逻辑:比如城市名无法识别时,标记为
None或NaN,避免整个流程中断
3. 将经纬度合并回原CSV
遍历原CSV的每一行,根据城市名匹配对应的经纬度,新增Latitude和Longitude列:
Time,M1,M2,M3,CityName,Latitude,Longitude temp,num,num,num,loc,coord,coord 20-May-13,19,20,0,delhi,28.6139,77.2090 20-May-13,25,42,7,agra,27.1767,78.0081 20-May-13,23,35,4,mumbai,19.0760,72.8777 20-May-13,21,32,3,delhi,28.6139,77.2090 20-May-13,17,27,1,mumbai,19.0760,72.8777 20-May-13,16,40,5,delhi,28.6139,77.2090
通用化适配要点
- 动态列识别:依赖CSV第二行的类型标记,自动定位需要地理编码的列,适配任意结构的CSV
- 全量数据保留:处理过程中不修改原有列的内容,仅新增经纬度列
- 容错机制:对编码失败的城市做特殊标记,保证工具能完整处理整个CSV文件
内容的提问来源于stack exchange,提问作者gkuhu
相关产品推荐
相关产品推荐

