为多站点时序数据匹配经纬度遇NaN问题,求高效解决方案
解决时序数据匹配经纬度全为NaN的问题
问题根源
你的代码返回全NaN,核心原因是两个数据集的ID格式不匹配:
- 时序数据里的
ID是数值类型(比如301、321) - 元数据里的
ID是带双引号、尾部空格的字符串(比如"301 ")
两者类型和内容都不统一,导致map无法找到对应匹配项,只能返回NaN。
高效解决方案
步骤1:清洗元数据的ID列
先把元数据里的ID处理成和时序数据一致的格式:
# 去除ID字段的双引号和前后空格,再转为整数类型 metadata['ID'] = metadata['ID'].str.strip('" ').astype(int)
步骤2:匹配经纬度(两种可选方式)
方式一:用map继续实现
清洗后再用你原来的逻辑,就能正常匹配:
df['latitude'] = df['ID'].map(metadata.set_index('ID')['Latitude']) df['longitude'] = df['ID'].map(metadata.set_index('ID')['Longitude'])
方式二:用merge(更直观,适合多字段匹配)
如果需要同时匹配纬度和经度,用merge代码可读性更强,效率也很高:
# 只保留元数据里需要的ID、纬度、经度列,避免合并冗余字段 merged_df = df.merge(metadata[['ID', 'Latitude', 'Longitude']], on='ID', how='left')
how='left'会保留时序数据里所有行,即使某个ID在元数据里找不到(这种情况会返回NaN,方便你排查缺失的站点)。
验证匹配结果
可以用以下代码检查是否还有匹配失败的情况:
# 查看匹配后纬度仍为NaN的行 print(merged_df[merged_df['Latitude'].isna()])
如果输出为空,说明所有ID都匹配成功;如果有内容,说明这些ID在元数据里不存在,需要补充元数据或者检查ID是否有误。
内容的提问来源于stack exchange,提问作者Ahegg
相关产品推荐
相关产品推荐

