You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:45:03