基于时间、纬度和经度合并DataFrame后出现NaN值的问题排查
合并DataFrame后气象数据全为NaN的排查与解决方法
出现这个问题的核心原因是你指定的三个匹配键(Latitude、Longitude、time)在两个DataFrame中没有找到可匹配的组合,导致右连接(how='right')保留了dfh的所有行,但无法从df中匹配到对应数据,最终填充为NaN。以下是具体排查和解决步骤:
1. 检查匹配键的数据类型是否一致
两个DataFrame中同一键的类型必须完全一致才能匹配,比如一个是数值型、一个是字符串型,或者时间格式不统一,都会导致匹配失败。
- 执行以下代码查看键的类型:
print("df的键类型:") print(df[['Latitude','Longitude','time']].dtypes) print("\ndfh的键类型:") print(dfh[['Latitude','Longitude','time']].dtypes) - 统一类型示例:
- 将时间转为datetime格式:
df['time'] = pd.to_datetime(df['time']) dfh['time'] = pd.to_datetime(dfh['time']) - 将经纬度转为浮点型:
df[['Latitude','Longitude']] = df[['Latitude','Longitude']].astype(float) dfh[['Latitude','Longitude']] = dfh[['Latitude','Longitude']].astype(float)
- 将时间转为datetime格式:
2. 消除经纬度的精度差异
如果经纬度的小数位数不同(比如df保留6位、dfh保留3位),表面数值看起来一致,但实际存储值不同,会导致匹配失败。
- 统一精度示例(保留3位小数):
df['Latitude'] = df['Latitude'].round(3) df['Longitude'] = df['Longitude'].round(3) dfh['Latitude'] = dfh['Latitude'].round(3) dfh['Longitude'] = dfh['Longitude'].round(3)
3. 统一时间字段的粒度
如果df的时间包含时分秒(如2023-01-01 14:30:00),而dfh的时间仅到日期(如2023-01-01),两者无法匹配。
- 统一时间粒度为日期:
df['time'] = df['time'].dt.date dfh['time'] = dfh['time'].dt.date
4. 检查匹配键的列名是否完全一致
注意列名的大小写、空格等细节,比如df里是latitude(小写),dfh里是Latitude(大写),或者列名带有空格(如 Latitude),都会导致匹配失败。
- 查看列名:
print("df的列名:", df.columns.tolist()) print("dfh的列名:", dfh.columns.tolist()) - 重命名列名统一:
df.rename(columns={'latitude':'Latitude', 'longitude':'Longitude'}, inplace=True)
5. 验证键组合是否真的存在重叠
如果以上步骤都没问题,可能是dfh的(纬度,经度,时间)组合在df中完全不存在。可以抽样验证:
# 取dfh前5行的键组合 sample = dfh[['Latitude','Longitude','time']].head(5) # 在df中查找是否有匹配项 match_result = df[ (df['Latitude'].isin(sample['Latitude'])) & (df['Longitude'].isin(sample['Longitude'])) & (df['time'].isin(sample['time'])) ] print("匹配到的行数:", len(match_result))
如果结果为0,说明两个数据集的键组合确实没有重叠,需要确认数据的时间范围、经纬度范围是否一致,或者数据来源是否正确。
内容的提问来源于stack exchange,提问作者user21868927
相关产品推荐
相关产品推荐

