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

Python中1500万行DataFrame跨表匹配站点经纬度的提速方法问询

高效实现站点经纬度匹配的方案

你的嵌套循环写法确实会因为**O(n*m)**的时间复杂度(1500万×500的运算量)导致运行极慢,完全没必要这么做——pandas专门提供了高效的合并方法来解决这类匹配问题,下面是具体的优化步骤:

核心思路:用merge替代嵌套循环

pandas的merge方法基于哈希表实现,时间复杂度仅为O(n+m),能极大提升匹配效率。具体步骤如下:

1. 先筛选2018年的数据(可选但推荐)

先缩小需要匹配的数据范围,减少后续合并的运算量:

# 注意:如果year列是整数类型,去掉引号即可
filtered_2018 = data[data['year'] == '2018']

2. 确保匹配键类型一致

检查data和info的station列类型是否相同(比如一个是字符串、一个是整数会导致匹配失败),统一类型:

data['station'] = data['station'].astype(str)
info['station'] = info['station'].astype(str)

3. 执行合并匹配

只保留info中需要的列(station、latitude、longitude),用左连接确保保留data中所有2018年的记录:

# 合并数据,匹配经纬度
merged_data = filtered_2018.merge(
    info[['station', 'latitude', 'longitude']],
    on='station',
    how='left'  # 左连接:保留filtered_2018的所有行,匹配不到的经纬度为NaN
)

4. 将结果更新回原DataFrame(如果需要)

如果要把匹配好的经纬度写回原data的对应行:

data.loc[data['year'] == '2018', ['latitude', 'longitude']] = merged_data[['latitude', 'longitude']].values

额外注意事项

  • 确保info中的station列无重复值,如果有重复,先去重:
    info = info.drop_duplicates(subset='station', keep='first')
    
  • 如果不需要保留原data中2018年以外的行,直接使用merged_data即可,无需更新原DataFrame。

这种方法处理1500万条数据的匹配,通常只需要几秒到几十秒就能完成,比嵌套循环快几个数量级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:04:27