Pandas调用reverse-geocoder逆地理编码时结果全被最后一条覆盖求助
问题原因
- 核心错误是循环内的赋值逻辑错误:执行
df["city"] = i["name"]、df["state"] = i["admin1"]这类语句时,是对DataFrame的整列做统一赋值,而非给当前遍历的对应行赋值。每一轮循环都会覆盖全列所有行的已有结果,最终全列都会保留最后一次循环的赋值结果,所以才会出现所有行的结果都和第二条一致的情况。 - 其次遍历过程没有和行索引绑定,你拿到了当前行的经纬度查询结果,但没有匹配回对应的行位置,自然无法正确写入对应单元格。
百万级数据高效处理方案
reverse-geocoder的rg.search()方法原生支持直接传入经纬度元组组成的列表做批量查询,底层基于k-d树实现离线查询,性能远高于逐行调用,完全可以支撑百万级数据的处理需求,批量处理100万条数据通常仅需几秒到几十秒即可完成。
你可以直接用如下代码实现全量处理,无需逐行循环:
import pandas as pd import reverse_geocoder as rg # 读取原始数据 df = pd.read_csv('reverse.csv') # 批量查询所有经纬度的逆地理编码结果 geo_results = rg.search(list(zip(df['lat'], df['long']))) # 将查询结果转为DataFrame,重命名列后和原表合并 geo_df = pd.DataFrame(geo_results)[['name', 'admin1', 'cc']] geo_df.columns = ['city', 'state', 'country'] df = pd.concat([df, geo_df], axis=1)
内容的提问来源于stack exchange,提问作者grega
相关产品推荐
相关产品推荐

