Pandas如何基于lat、long列填充city_name与city_id列缺失值
Pandas 基于经纬度补全城市字段缺失值方案
核心思路是先用已有有效数据生成经纬度(lat+long)和城市信息(city_name+city_id)的唯一映射,再用映射关系补全所有匹配经纬度的缺失值。
实现代码
第一步:导入依赖构造示例数据
import pandas as pd import numpy as np # 构造示例DataFrame data = { "city_name": [np.nan, np.nan, np.nan, "new york", "paris", "london"], "city_id": [np.nan, np.nan, np.nan, "c1", "c2", "c3"], "lat": [-121.77, -122.77, -123.77, -121.77, -122.77, -123.77], "long": [37.24, 38.24, 39.24, 37.24, 38.24, 39.24] } df = pd.DataFrame(data)
第二步:补全缺失值(两种方案可选)
方案1:小数据量场景,用groupby直接分组填充
代码更简洁,直接按经纬度分组,每组内用非空值填充整组的缺失值:
# 补全city_name df['city_name'] = df.groupby(['lat', 'long'])['city_name'].transform( lambda x: x.dropna().iloc[0] if x.notna().any() else x ) # 补全city_id df['city_id'] = df.groupby(['lat', 'long'])['city_id'].transform( lambda x: x.dropna().iloc[0] if x.notna().any() else x )
方案2:大数据量场景,先做映射表再合并
重复经纬度多的情况下效率更高:
# 提取有效城市映射并去重 city_map = df.dropna(subset=['city_name', 'city_id'])\ .drop_duplicates(subset=['lat', 'long'])\ [['lat', 'long', 'city_name', 'city_id']]\ .rename(columns={'city_name':'filled_name', 'city_id':'filled_id'}) # 映射表合并回原表,填充缺失值 df = df.merge(city_map, on=['lat', 'long'], how='left') df['city_name'] = df['city_name'].fillna(df['filled_name']) df['city_id'] = df['city_id'].fillna(df['filled_id']) # 清理临时字段 df = df.drop(columns=['filled_name', 'filled_id'])
注意事项
如果存在同一个经纬度对应多个不同城市信息的情况,上述代码默认取第一个出现的有效值,你可以根据业务需求调整去重规则,比如取出现频次最高的有效值。
内容的提问来源于stack exchange,提问作者Konstantin Voronin
相关产品推荐
相关产品推荐

