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

Python Pandas调用Nominatim补全缺失街道字段时遇报错求助

解决地理编码补全街道的代码错误问题

问题回顾

需要补全CSV中纬度和经度非空但街道为空的行的街道名称,使用geolocator.reverse()实现,但多次尝试代码出现错误。

常见错误原因分析

  1. 循环中调用isnull()的错误
    你在zip循环中拿到的a、b、c是单个值(字符串或数值),而isnull()是pandas Series/DataFrame的方法,单个值无法调用,应该用pd.isna()判断单个值是否为空。

  2. np.where的使用误区
    np.where的第二个参数必须是表达式(返回标量/数组),不能执行多行赋值或函数调用语句,它无法处理需要发起网络请求的逻辑,不适合这个场景。

  3. apply的使用错误
    对df["street"](Series)调用apply时,参数x是单个街道值,没有x.street、x.latitude属性;同时lambda表达式不支持多行代码,复杂逻辑应该用普通函数配合DataFrame的apply(axis=1)(处理整行数据)。

  4. 坐标格式错误
    你之前直接拼接纬度和经度字符串,生成的格式(如40.85736-73.84657)不符合Nominatim的要求,正确格式应为"纬度, 经度"。

正确实现代码

import pandas as pd
from geopy.geocoders import Nominatim
import time

# 修正Windows路径格式(用原始字符串避免转义问题)
df = pd.read_csv(r"C:\sample.csv")

# 初始化地理编码器,user_agent需设置唯一标识
geolocator = Nominatim(user_agent="my_street_filler_app")

def fill_missing_street(row):
    # 判断条件:街道为空,且纬度、经度均非空
    if pd.isna(row["street"]) and not pd.isna(row["latitude"]) and not pd.isna(row["longitude"]):
        # 构造符合要求的坐标字符串
        coords = f"{row['latitude']}, {row['longitude']}"
        try:
            # 加入延迟,避免触发Nominatim的请求速率限制(每秒最多1次)
            time.sleep(1)
            location = geolocator.reverse(coords)
            if location:
                # 从结构化地址中提取街道(更准确的方式)
                return location.raw['address'].get('road', row['street'])
                # 若需要完整地址前缀,可改用:return location.address.split(',')[0].strip()
        except Exception as e:
            print(f"处理坐标 {coords} 失败: {str(e)}")
    # 不满足条件则返回原街道值
    return row["street"]

# 应用函数到每一行,只更新需要补全的街道
df["street"] = df.apply(fill_missing_street, axis=1)

# 保存处理后的结果
df.to_csv(r"C:\filled_sample.csv", index=False)

关键注意点

  • 请求速率限制:Nominatim要求每秒最多1次请求,必须加入time.sleep(1),否则可能被临时封禁IP。
  • 结构化地址提取:使用location.raw['address']可以获取更精准的地址组件(如road对应街道),比拆分完整地址字符串更可靠。
  • 异常处理:加入try-except捕获网络错误、编码失败等异常,避免程序中断。

内容的提问来源于stack exchange,提问作者xiaochuan fang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:57:14