Pandas执行join合并DataFrame时匹配字段值变为NaN如何解决
问题根因
调用groupby(['City'])做聚合后,输出的group_metro_manila会自动把City设为行索引,City不再作为普通列存在。你在join时传入on='City'参数,pandas会尝试在当前表的普通列中查找City字段作为匹配键,找不到对应字段就无法完成值匹配,因此关联出的经纬度字段全部为NaN。
修正方案
方法1:适配原有join逻辑(代码改动最小)
既然两个表的匹配维度City都已经被设为索引(你已经对city_location做了set_index('City')操作),直接去掉on参数即可完成索引对齐关联:
merge_df = group_metro_manila.join( city_location[['City','Latitude','Longitude']].set_index('City') )
执行后所有城市的经纬度会按城市名正确匹配,不会出现空值。
方法2:用merge实现(对初学者更友好)
如果暂时记不清join的索引匹配规则,直接用pd.merge显式指定匹配字段,逻辑更直观,不容易踩索引的坑:
merge_df = pd.merge( left=group_metro_manila.reset_index(), # 重置索引,把City从行索引变回普通列 right=city_location[['City','Latitude','Longitude']], on='City', # 明确指定两个表用City列做关联匹配 how='left' # 保留所有分组结果中的城市,和原join的逻辑完全一致 )
这个方法不需要额外关注索引状态,是日常做表关联最不容易出错的写法。
日常避坑提示
做表关联前可以先做两步简单检查,能规避90%的匹配空值问题:
- 确认用来匹配的字段是在普通列中,还是被设为了行索引,关联时两边的匹配键状态要对齐
- 打印两边的匹配字段值,检查是否存在拼写不一致、大小写差异、前后多余空格的问题,比如
Quezon City写成Quezon City(多一个空格)也会导致匹配失败返回NaN
内容的提问来源于stack exchange,提问作者Jj Encrypt
相关产品推荐
相关产品推荐

