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
相关产品推荐
相关产品推荐

