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

优化Pandas中两个DataFrame城市名匹配及经纬度列添加的耗时问题

优化经纬度匹配的高效方案

这问题我太有共鸣了!你当前用apply加自定义函数的做法慢的核心原因是:逐行循环+重复的布尔索引查找,1万多行数据相当于做了1万多次全表扫描,时间复杂度直接拉满。咱们换用pandas的内置合并操作,效率能提升几十甚至上百倍!

最优方案:用pd.merge矢量化合并

这是处理这类“根据关联字段匹配数据”场景的标准做法,底层是C实现的矢量化操作,完全避免Python层面的逐行循环。

代码示例

# 按城市名称合并两个DataFrame,保留df1的所有行(对应原逻辑中匹配不到返回0的场景)
df_result = pd.merge(df1, df2, on='city', how='left')

# 把匹配不到的经纬度设置为0(和你原函数的else逻辑一致)
df_result[['lat', 'lon']] = df_result[['lat', 'lon']].fillna(0)

为什么这方法更快?

原来的apply逻辑时间复杂度是O(n*m)(n是df1行数,m是df2行数),相当于每一行都要遍历一遍df2找匹配;而merge用哈希表做关联匹配,时间复杂度接近O(n+m),1万行数据基本几秒就能处理完。

退而求其次:用字典加速查找(如果一定要用apply)

如果你因为某些场景必须保留apply的形式,可以先把df2转成字典,利用字典O(1)的查找效率来优化:

# 先构建城市到经纬度的字典,一次转换完成
city_coords = df2.set_index('city')[['lon', 'lat']].to_dict('index')

# 改写查询函数,直接查字典
def ret_longlat(city_name):
    # 找不到就返回默认的(0,0)
    coords = city_coords.get(city_name, {'lon': 0, 'lat': 0})
    return coords['lon'], coords['lat']

# 一次性生成经纬度列,避免两次apply调用
df_result[['long', 'lat']] = df_result['city_names'].apply(lambda x: pd.Series(ret_longlat(x)))

这个方法比你原来的代码快很多,但还是不如merge高效,只适合特殊场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:16:37